protected string GetSparePartDetailsUrl(SparePartFranch sparePart)
 {
     SparePartPriceKey key = new SparePartPriceKey(
         sparePart.Manufacturer,
         sparePart.PartNumber,
         sparePart.SupplierID);
     return UrlManager.GetSparePartDetailsUrl(key.ToUrlString());
 }
Exemple #2
0
        //private static Func<StoreDataContext, SparePartPriceKey, IQueryable<SparePart>> _getPart =
        //    CompiledQuery.Compile<StoreDataContext, SparePartPriceKey, IQueryable<SparePart>>(
        //        (dc, key) =>
        //            from part in dc.SpareParts
        //            where part.Manufacturer == key.Mfr && part.PartNumber == key.PN && part.SupplierID == key.SupplierId
        //            select part);
        public static SparePartFranch Load(SparePartPriceKey key)
        {
            using (var dc = new DCFactory<StoreDataContext>())
            {

                    return SparePartsDacFranch.Load(dc.DataContext, key);

            }
        }
        public static SparePartFranch Load(StoreDataContext context, SparePartPriceKey key)
        {
            if (context == null)
                throw new ArgumentNullException("context");
            if (key == null)
                throw new ArgumentNullException("key");

            string query = @"SELECT * FROM fSparePartWithCustomFactors({0},{1},{2},{3},{4})";

            return context.ExecuteQuery<SparePartFranch>(query,
                "" /* код франча для "региональных" прайсов */,
                key.PN, key.Mfr, key.SupplierId,
                0 /*добавочный период к срокам поставки*/,"rmsauto").SingleOrDefault<SparePartFranch>();
        }
 protected string GetSparePartDetailsUrl( OrderLine line )
 {
     if( line != null )
     {
         SparePartPriceKey key = new SparePartPriceKey(
             line.Manufacturer,
             line.PartNumber,
             line.SupplierID );
         return UrlManager.GetSparePartDetailsUrl( key.ToUrlString() );
     }
     else
     {
         return null;
     }
 }
Exemple #5
0
        public static SparePartFranch Load(StoreDataContext context, SparePartPriceKey key)
        {
            if (context == null)
                throw new ArgumentNullException("context");
            if (key == null)
                throw new ArgumentNullException("key");

            //TODO: Протестировать создание _getPart

            string query = @"SELECT * FROM fSparePartWithCustomFactors({0},{1},{2},{3})";

            return context.ExecuteQuery<SparePartFranch>(query,
                AcctgRefCatalog.RmsFranches[SiteContext.Current.InternalFranchName].RegionCode /* код франча для "региональных" прайсов */,
                key.PN, key.Mfr, key.SupplierId).SingleOrDefault<SparePartFranch>();
        }
 public static SparePartFranch Load(SparePartPriceKey key)
 {
     using (var dc = new DCFactory<StoreDataContext>())
     {
         try
         {
             dc.DataContext.ExecuteCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED");
             return Load(dc.DataContext, key);
         }
         catch (Exception ex)
         {
             Logger.WriteError(ex.Message, EventLogerID.BLException, EventLogerCategory.FatalError, ex);
             return default(SparePartFranch);
         }
         finally
         {
           //  dc.DataContext.Connection.Close();
         }
     }
 }
        /// <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);
                    }
                }
            }
        }
        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);
                    }
                }
            }
        }
Exemple #9
0
        //TODO: Здесь диспозиться как-то объект, из-за этого метод нельзя вызвать 2 раза за сессию
        public OrderResult SendOrder(OrderLineItemSource[] items, string custOrderNum)
        {
            if (!Rights.Contains("3"))
            {
                var ex = new Exception("Access Denied");
                Logger.WriteError(CurrentIdentityName + ": Access Denied", EventLogerID.BLException, EventLogerCategory.WebServiceError, ex);
                throw ex;
            }

            OrderResult result = null;
            _getAppLock(new StoreDataContext().Connection.ConnectionString);
            try
            {
                RmsAuto.Acctg.ClientGroup clientGroup = profile.ClientGroup;
                Logger.WriteInformation(string.Format(LoggerTemplate, "Order lines to process: " + items.Length, DateTime.Now.ToString(TimeFormat), "Enter 'SendOrder' method of web-service"), EventLogerID.AdditionalLogic, EventLogerCategory.WebServiceError, new Object[] { true });
                if (items.Length == 0) {
                    var ex = new Exception("Количество строк заказа должно быть  > 0");
                    Logger.WriteError(string.Format(LoggerTemplate, items.Length, DateTime.Now.ToString(TimeFormat), "Error checking number of lines: must be > 0"), EventLogerID.AdditionalLogic, EventLogerCategory.WebServiceError, ex);
                    throw ex;
                }
                // Сопоставление сертификата (сертификат 'замаплен' на доменную учетку) и учетки на сайте

                decimal personalMarkup = profile.PersonalMarkup;
                //подгружаем "настройки" клиента
                StoreDataContext DC = new StoreDataContext();

                var userSet = DC.spSelUserSetting(profile.UserId).FirstOrDefault();
                byte PrcExcessPrice = userSet == null ? (byte)0 : userSet.PrcExcessPrice;
                //подгружаем список "собственных складов наличия"
                List<int> ownStores = StoreRefCatalog.RefOwnStores.Items.Select(x => x.SupplierID).ToList();

                //TODO: Вынести логику проверки в общий метод для загрузки через Excel
                List<OrderItemResult> infos = new List<OrderItemResult>();
                List<OrderLine> orderLines = new List<OrderLine>();
                bool existSuccesItems = false;
                foreach (var line in items)
                {
                    //подгружаем инфу о детали
                    SparePartPriceKey key = new SparePartPriceKey(line.Manufacturer, line.PartNumber, line.SupplierID);
                    var part = SparePartsDac.Load(DC, key);
                    //производим количественные проверки, и проверку наличия детали
                    if (part == null)
                    {
                        infos.Add(
                        new OrderItemResult()
                        {
                            ItemID = line.ItemID,
                            ResultInfo = ItemResultCode.SparePartNotFound.ToTextOrName(),
                            ResultCode = (int)ItemResultCode.SparePartNotFound
                        });
                    }
                    else if (line.Qty < part.DefaultOrderQty)
                    {
                        infos.Add(
                            new OrderItemResult()
                            {
                                ItemID = line.ItemID,
                                ResultInfo = string.Format(ItemResultCode.MinOrderQtyError.ToTextOrName(), part.DefaultOrderQty),
                                ResultCode = (int)ItemResultCode.MinOrderQtyError
                            });
                    }
                    else if (line.Qty % part.DefaultOrderQty != 0)
                    {
                        infos.Add(
                            new OrderItemResult()
                            {
                                ItemID = line.ItemID,
                                ResultInfo = ItemResultCode.DefaultOrderQtyError.ToTextOrName(),
                                ResultCode = (int)ItemResultCode.DefaultOrderQtyError
                            });
                    }
                    else if (part.QtyInStock.GetValueOrDefault() > 0 && line.Qty > part.QtyInStock)
                    {
                        infos.Add(
                            new OrderItemResult()
                            {
                                ItemID = line.ItemID,
                                ResultInfo = string.Format(ItemResultCode.QtyInStockError.ToTextOrName(), part.QtyInStock),
                                ResultCode = (int)ItemResultCode.QtyInStockError
                            });
                    }
                    else
                    {
                        decimal? priceClientYesterday = null; // "Вчерашная" цена
                        bool isErrorPrice = false;
                        //проверка цены
                        //(т.е. если текущая цена > цена клиента + допустимый % превышения цены, то это факт превышения цены)
                        if (part.GetFinalSalePrice(profile.ClientGroup, profile.PersonalMarkup) >
                            line.UnitPrice + Math.Round(line.UnitPrice * PrcExcessPrice / 100, 2) &&
                            //т.е. расчет "вчерашних" цен производится ТОЛЬКО для собственных складов наличия
                            ownStores != null && ownStores.Contains(part.SupplierID))
                        {
                            using (var dc = new dcCommonDataContext())
                            {
                                try
                                {
                                    //получаем список "вчерашних" и сегодняшних цен фтп для сравнения
                                    //если загрузка производится в понедельник, то "вчерашние" цены фтп должны браться по пятнице, субботе и воскресенью
                                    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)profile.ClientGroup))
                                            .ToList<decimal>();

                                    //для каждой из цен производим сравнение с ценой клиента +- 1 копейка (чтобы учесть возможные погрешности при округлении)
                                    //TODO: Переписать через LINQ

                                    foreach (var price in prices)
                                    {
                                        decimal pClient = Math.Round(line.UnitPrice, 2);	//цена клиента в 'Excel'
                                        decimal pFtp = Math.Round(price, 2);				//одна из вчерашних цен нашего Ftp
                                        if (pClient > 0 && (pClient == pFtp ||
                                            pClient == (pFtp - 0.01M) ||
                                            pClient == (pFtp + 0.01M)))
                                        {
                                            //добавляем допустимый % превышения (доли копеек отбрасываем)
                                            priceClientYesterday = pFtp + pFtp * PrcExcessPrice / 100;
                                            priceClientYesterday = decimal.Truncate((decimal)priceClientYesterday * 100) / 100;
                                            break;
                                        }
                                    }
                                    //если ни одного совпадения не найдено, то позиция отваливается с ошибкой "Несоответствие цены ФТП-прайсу"
                                    isErrorPrice = (prices.Count() > 0 && !priceClientYesterday.HasValue);

                                    if (prices.Count() == 0) //Если цен не найдено, ошибка
                                        isErrorPrice = true;
                                }
                                catch (Exception ex)
                                {
                                    Logger.WriteError(@"Error while calculating 'Yesterday' price!", EventLogerID.UnknownError, EventLogerCategory.UnknownCategory, ex);
                                }
                                finally
                                {

                                    if (dc.Connection.State == System.Data.ConnectionState.Open)
                                        dc.Connection.Close();
                                }
                            }
                        }

                        if (isErrorPrice)
                        {
                            infos.Add(
                            new OrderItemResult()
                            {
                                ItemID = line.ItemID,
                                ResultInfo = ItemResultCode.PriceError.ToTextOrName(),
                                ResultCode = (int)ItemResultCode.PriceError
                            });
                        }
                        else
                        {
                            OrderLine ol = new OrderLine()
                            {
                                AcctgOrderLineID = -line.ItemID, //временный ID пока УС не обработает заказ и не проставит свой ID
                                Manufacturer = part.Manufacturer,
                                PartNumber = part.PartNumber,
                                SupplierID = part.SupplierID,
                                ReferenceID = line.ReferenceID,
                                DeliveryDaysMin = part.DeliveryDaysMin,
                                DeliveryDaysMax = part.DeliveryDaysMax,
                                PartName = part.PartName,
                                PartDescription = part.PartDescription,
                                WeightPhysical = part.WeightPhysical,
                                WeightVolume = part.WeightVolume,
                                UnitPrice = (priceClientYesterday.HasValue ? priceClientYesterday.Value : part.GetFinalSalePrice(clientGroup, personalMarkup)),
                                Qty = line.Qty,
                                StrictlyThisNumber = line.StrictlyThisNumber,
                                VinCheckupData = string.Empty,
                                OrderLineNotes = string.Empty,
                                CurrentStatus = OrderLineStatusUtil.StatusByte("PreOrder")
                            };
                            orderLines.Add(ol);

                            infos.Add(
                                new OrderItemResult()
                                {
                                    ItemID = line.ItemID,
                                    ResultInfo = ItemResultCode.Successs.ToTextOrName(),
                                    ResultCode = (int)ItemResultCode.Successs
                                });
                            existSuccesItems = true;
                        }
                    }
                }

                int? orderID = null;
                if (existSuccesItems)
                {
                    orderID = OrderBO.CreateOrderForService(profile.UserId, profile.ClientId, "1", orderLines, custOrderNum);
                }

                result = new OrderResult()
                {
                    OrderID = orderID,
                    ItemResults = infos.ToArray()
                };

                if (DC.Connection.State == System.Data.ConnectionState.Open)
                {
                    DC.Connection.Close();
                }

                _releaseAppLock();
            }
            catch (Exception ex)
            {
                if (connection.State == System.Data.ConnectionState.Open)
                {
                    try
                    {
                        _releaseAppLock();
                    }
                    catch (Exception ex1)
                    {
                        connection.Close();
                        Logger.WriteError(string.Format(LoggerTemplate, result.ItemResults.Length, DateTime.Now.ToString(TimeFormat), "Error while release lock"), EventLogerID.AdditionalLogic, EventLogerCategory.WebServiceError, ex1);
                    }
                }

                Logger.WriteError(string.Format(LoggerTemplate, "Order lines processed: not defined", DateTime.Now.ToString(TimeFormat), "Exception while executing web-service"), EventLogerID.AdditionalLogic, EventLogerCategory.WebServiceError, ex);
            }

            //Записываем сколько на выходе
            //TODO: возможно это можно переписать через какое-то LINQ
            var q1 =  result.ItemResults.Where(x => x.ResultCode == (int)ItemResultCode.Successs).Count();
            var q2 =  result.ItemResults.Where(x => x.ResultCode == (int)ItemResultCode.SparePartNotFound).Count();
            var q3 =  result.ItemResults.Where(x => x.ResultCode == (int)ItemResultCode.QtyInStockError).Count();
            var q4 =  result.ItemResults.Where(x => x.ResultCode == (int)ItemResultCode.PriceError).Count();
            var q5 =  result.ItemResults.Where(x => x.ResultCode == (int)ItemResultCode.MinOrderQtyError).Count();

            Logger.WriteInformation(string.Format(LoggerTemplate, "OrderID: " + (result.OrderID) + "\rOrder lines processed: " + result.ItemResults.Count() + "\r  Success: " + q1 + ",\r  SparePartNotFound: " + q2 + ",\r  QtyInStockError: " + q3 + ",\r  PriceError: " + q4 + ",\r  MinOrderQtyError: " + q5, DateTime.Now.ToString(TimeFormat), "Successful exit of 'SendOrder' method"), EventLogerID.AdditionalLogic, EventLogerCategory.WebServiceLogic, new Object[] { true });
            return result;
        }
 /// <summary>
 /// Перенос детали из количественных ошибок в положительные списки
 /// </summary>
 /// <param name="SPPK">Ключ детали</param>
 private void FromERQty( SparePartPriceKey SPPK )
 {
     var tAll = rowsERQty.Where( t => t.manufacturer == SPPK.Mfr && t.partNumber == SPPK.PN && t.supplierId == SPPK.SupplierId ).ToList();
     foreach ( var oneItem in tAll )
     {
         rowsERQty.Remove( oneItem );
         if ( oneItem.isOK )
         {
             rowsOK.Add( new CartImportRow()
             {
                 rowID = Guid.NewGuid(),
                 manufacturer = oneItem.manufacturer,
                 partNumber = oneItem.partNumber,
                 supplierId = oneItem.supplierId,
                 referenceID = oneItem.referenceID,
                 deliveryPeriod = oneItem.deliveryPeriod,
                 itemName = oneItem.itemName,
                 priceClient = oneItem.priceClient,
                 priceCurr = oneItem.priceCurr,
                 pricePrc = oneItem.pricePrc,
                 quantity = oneItem.quantity,
                 rowN = oneItem.rowN,
                 strictlyThisNumber = oneItem.strictlyThisNumber
             } );
         }
         else
         {
             rowsAccept.Add( new CartImportRow()
             {
                 rowID = Guid.NewGuid(),
                 manufacturer = oneItem.manufacturer,
                 partNumber = oneItem.partNumber,
                 supplierId = oneItem.supplierId,
                 referenceID = oneItem.referenceID,
                 deliveryPeriod = oneItem.deliveryPeriod,
                 itemName = oneItem.itemName,
                 priceClient = oneItem.priceClient,
                 priceCurr = oneItem.priceCurr,
                 pricePrc = oneItem.pricePrc,
                 quantity = oneItem.quantity,
                 rowN = oneItem.rowN,
                 strictlyThisNumber = oneItem.strictlyThisNumber
             } );
         }
     }
 }
        private void BindData()
        {
            var items = SiteContext.Current.CurrentClient.Cart.GetItems();
            this.CartItemsCount = items.Count();
            this.ContainsBadItems = items.Any(i => i.HasIssues);
            this.PartsCount = items.Sum(i => i.Qty);
            this.Total = items.Sum(i => i.ItemTotal);

            switch( (SortOptions)Convert.ToInt32(_sortBox.SelectedValue) )
            {
                case SortOptions.InputOrder:
                    _cartItemsRepeater.DataSource = items.OrderBy(o => o.ItemID);
                    break;
                case SortOptions.ManufacturerArticle:
                    _cartItemsRepeater.DataSource = items
                        .OrderBy(o => o.Manufacturer)
                        .ThenBy(o => o.PartNumber);
                        break;
            }

            // deas 01.03.2011 task2401
            // заполнение сгруппированной корзины
            // deas 16.03.2011 task2983
            // не проверять количественные показатели у позиций отсутствующих в прайс листе
            _groupCart.Clear();
            foreach ( var oneI in items )
            {
                SparePartPriceKey key = new SparePartPriceKey( oneI.Manufacturer, oneI.PartNumber, oneI.SupplierID );
                if ( _groupCart.ContainsKey( key ) )
                {
                    _groupCart[key].Qty += oneI.Qty;
                    if ( oneI.SparePart != null )
                    {
                        _groupCart[key].UpdateQtyIssues( oneI.SparePart );
                    }
                }
                else
                {
                    _groupCart.Add( key, new ShoppingCartItem
                    {
                        Manufacturer = oneI.Manufacturer,
                        PartNumber = oneI.PartNumber,
                        SupplierID = oneI.SupplierID,
                        DeliveryDaysMin = oneI.DeliveryDaysMin,
                        DeliveryDaysMax = oneI.DeliveryDaysMax,
                        Qty = oneI.Qty
                    } );
                    if ( oneI.SparePart != null )
                    {
                        _groupCart[key].UpdateQtyIssues( oneI.SparePart );
                    }
                }
            }

            _cartItemsRepeater.DataBind();
            _btnRecalc.Enabled = CartItemsCount > 0;
        }
 internal ArticleAddedEventArgs(SparePartPriceKey key, int qty)
 {
     PartKey = key;
     Qty = qty;
 }
        protected void rptSearchResults_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item ||
                e.Item.ItemType == ListItemType.AlternatingItem)
            {
                string valGroup = "QtyValGroup_" + e.Item.ItemIndex.ToString();
                //((ImageButton)e.Item.FindControl("_btnAddToCart")).ValidationGroup =
                //((BaseValidator)e.Item.FindControl("_qtyReqValidator")).ValidationGroup = valGroup;

                SparePartFranch part = (SparePartFranch)((Disc)e.Item.DataItem).SparePart;
                var partKey = new SparePartPriceKey(
                    part.Manufacturer,
                    part.PartNumber,
                    part.SupplierID);
                ((Label)e.Item.FindControl("_lblKey")).Text = partKey.ToString();

                var txtQty = (TextBox)e.Item.FindControl("_txtQty");
                var btnAddToCart = (ImageButton)e.Item.FindControl("_btnAddToCart");
                var qtyPlaceHolder = (PlaceHolder)e.Item.FindControl("_qtyPlaceHolder");

                btnAddToCart.OnClientClick = string.Format("return validate_qty('{0}');", txtQty.ClientID);

                if (!SiteContext.Current.IsAnonymous && SiteContext.Current.User.Role == SecurityRole.Manager)
                {
                    if (SiteContext.Current.CurrentClient.IsGuest ||
                       !((ManagerSiteContext)SiteContext.Current)
                       .ClientDataSectionEnabled(ClientDataSection.Cart))
                    {
                        btnAddToCart.Visible = false;
                       // qtyPlaceHolder.Visible = false;
                    }
                }
            }
        }
 protected string GetSupplierStatisticUrl(object objSparePart)
 {
     var sparePart = (SparePartFranch)objSparePart;
     SparePartPriceKey key = new SparePartPriceKey(
         sparePart.Manufacturer,
         sparePart.PartNumber,
         sparePart.SupplierID);
     return UrlManager.GetSupplierStatisticUrl(key.ToString());
 }
 /// <summary>
 /// Обновление списка количественных ошибок
 /// </summary>
 private void UpdateERQtyList()
 {
     groupQtyRows.Clear();
     foreach ( CartImportRowERQty rERQty in rowsERQty )
     {
         SparePartPriceKey SPPK = new SparePartPriceKey( rERQty.manufacturer, rERQty.partNumber, rERQty.supplierId );
         if ( groupQtyRows.ContainsKey( SPPK ) )
         {
             groupQtyRows[SPPK] += rERQty.quantity;
         }
         else
         {
             groupQtyRows.Add( SPPK, rERQty.quantity );
         }
     }
     _lvERQty.DataSource = rowsERQty.OrderBy( t => t.manufacturer ).ThenBy( t => t.partNumber ).ThenBy( t => t.supplierId ).ThenBy( t => t.referenceID );
     _lvERQty.DataBind();
 }
Exemple #16
0
        public void Add( SparePartPriceKey key, int qty, bool addToOrder )
        {
            // deas 27.04.2011 task3929 добавление в корзине флага отправить в заказ
            if( key == null )
                throw new ArgumentNullException( "key" );
            if( qty <= 0 )
                throw new ArgumentException( "Quantity must be greater than zero", "qty" );

            var part = SparePartsDac.Load( key );
            if( part == null )
                throw new BLException( "К сожалению, данная позиция более не доступна. Попробуйте повторить поисковый запрос снова", true );

            // deas 28.02.2011 task2401
            // добавлено сравнение по ReferenceID
            var items = _storage.LoadItems().ToList();
            var existing = items.SingleOrDefault( i =>
                i.PartNumber == key.PN &&
                i.Manufacturer == key.Mfr &&
                i.SupplierID == key.SupplierId &&
                i.ReferenceID == "");

            if( existing != null )
            {
                existing.Qty += qty;
                //existing.ReferenceID = "";
                existing.UnitPrice = part.GetFinalSalePrice( _clientGroup, _personalMarkup );
            }
            else
            {
                items.Add(
                    new ShoppingCartItem
                    {
                        AddToOrder = addToOrder,
                        Manufacturer = part.Manufacturer,
                        PartNumber = part.PartNumber,
                        SupplierID = part.SupplierID,
                        DeliveryDaysMin = part.DeliveryDaysMin,
                        DeliveryDaysMax = part.DeliveryDaysMax,
                        PartName = part.PartName,
                        PartDescription = part.PartDescription,
                        Qty = qty,
                        ReferenceID = "",
                        UnitPrice = part.GetFinalSalePrice( _clientGroup, _personalMarkup )
                    });
            }
            using (var dc = new DCFactory<StoreDataContext>())
            {
                Save(dc.DataContext, items);
                OnArticleAdded( new ArticleAddedEventArgs( key, qty ) );
            }
        }
Exemple #17
0
        public void Update( IEnumerable<ShoppingCartItem> updates)
        {
            if( updates == null )
                throw new ArgumentNullException( "updates" );

            using( var context = new DCFactory<StoreDataContext>() )
            {
                // deas 28.02.2011 task2401
                // изменен словарь поиска для обновления ReferenceID
                //var items = LoadItems( context );
                var items = _storage.LoadItems( context.DataContext ).ToDictionary<ShoppingCartItem, int>( i => i.ItemID );

                // timeout 100 seconds.
                context.DataContext.CommandTimeout = 100000;

                var spareParts = SparePartsDac.LoadMassive(context.DataContext,
                    updates.Select( u => new SparePartPriceKey( u.Manufacturer, u.PartNumber, u.SupplierID ) ).Distinct()
                    ).ToDictionary( p => new SparePartPriceKey( p.Manufacturer, p.PartNumber, p.SupplierID ) );

                foreach( var upd in updates )
                {
                    // deas 28.02.2011 task2401
                    // добавлен дополнительный ключ для цен
                    var keyForSpare = new SparePartPriceKey( upd.Manufacturer, upd.PartNumber, upd.SupplierID );
                    //var key = new ShoppingCartKey( upd.Manufacturer, upd.PartNumber, upd.SupplierID, upd.ReferenceID );
                    if( items.ContainsKey( upd.ItemID ) )
                    {
                        var item = items[upd.ItemID];

                        // deas 28.04.2011 task3929 добавление в корзине флага отправить в заказ
                        item.AddToOrder = upd.AddToOrder;
                        item.Qty = upd.Qty;
                        item.ReferenceID = upd.ReferenceID;
                        item.StrictlyThisNumber = upd.StrictlyThisNumber;
                        item.VinCheckupDataID = upd.VinCheckupDataID;
                        item.ItemNotes = upd.ItemNotes;

                        SparePartFranch part;
                        if ( spareParts.TryGetValue( keyForSpare, out part ) )
                            item.UnitPrice = part.GetFinalSalePrice( _clientGroup, _personalMarkup );
                    }
                }

                // deas 28.02.2011 task2401
                // поиск и удаление повторов
                // раньше проверялось при добавлении в корзину
                foreach ( int dKey in items.Keys )
                {
                    ShoppingCartItem sci = items[dKey];
                    if ( sci.Qty > 0 )
                    {
                        var duplicateItem = from i in items.Values
                                            where i.Manufacturer == sci.Manufacturer
                                                && i.PartNumber == sci.PartNumber
                                                && i.SupplierID == sci.SupplierID
                                                && i.ReferenceID == sci.ReferenceID
                                                && i.ItemID != sci.ItemID
                                            select i;
                        foreach ( ShoppingCartItem delI in duplicateItem )
                        {
                            sci.Qty += delI.Qty;
                            delI.Qty = 0;
                        }
                    }
                }
                //var sparePartKeys = updates.Where(
                //    u => items.ContainsKey( new SparePartPriceKey( upd.Manufacturer, upd.PartNumber, upd.SupplierID ) )
                //    );

                //var sp = SparePartsDac.LoadMassive( context, l );
                //foreach( var el in sp )
                //{
                //    var key = new SparePartPriceKey( el.Manufacturer, el.PartNumber, el.SupplierID );
                //    var item = items[ key ];
                //    var upd = updates.Where( itm => itm.Manufacturer == el.Manufacturer && itm.PartNumber == el.PartNumber && itm.SupplierID == el.SupplierID ).FirstOrDefault();
                //    item.Qty = upd.Qty;
                //    item.ReferenceID = upd.ReferenceID;
                //    item.StrictlyThisNumber = upd.StrictlyThisNumber;
                //    item.VinCheckupDataID = upd.VinCheckupDataID;
                //    item.ItemNotes = upd.ItemNotes;
                //    item.UnitPrice = el.GetFinalSalePrice( _clientGroup, _personalMarkup );
                //}

                Save( context.DataContext, items.Values );
            }
        }
        /// <summary>
        /// Продолжение загрузки после количественных проверок
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void lbResume_Click( object sender, EventArgs e )
        {
            if ( sender == null )
            {
                foreach ( CartImportRowERQty CIREQ in rowsERQty )
                {
                    rowsER.Add( new CartImportRowError()
                    {
                        order = 10,
                        error = Resources.CartImport.CancelingInOrder + /*"отменено в заказе: "*/ ": " + CIREQ.errorText,
                        manufacturer = CIREQ.manufacturer,
                        partNumber = CIREQ.partNumber,
                        supplierId = CIREQ.supplierId.ToString(),
                        priceClient = CIREQ.priceClient.ToString( new NumberFormatInfo() { NumberDecimalSeparator = "," } ),
                        quantity = CIREQ.quantity.ToString(),
                        referenceID = CIREQ.referenceID,
                        rowN = CIREQ.rowN,
                        strictlyThisNumber = CIREQ.strictlyThisNumber ? Resources.Texts.Yes/*"да"*/ : Resources.Texts.No/*"нет"*/
                    } );
                }
                rowsERQty.Clear();
            }
            else
            {
                // обработка выведенной таблицы
                foreach ( var item in _lvERQty.Items )
                {
                    HiddenField HF = (HiddenField)( item as Control ).FindControl( "hfRowIDQty" );
                    Guid rid = new Guid( HF.Value.ToString() );
                    CartImportRowERQty CIREQ = rowsERQty.FirstOrDefault( t => t.rowID == rid );
                    if ( CIREQ != null )
                    {
                        TextBox TB = (TextBox)( item as Control ).FindControl( "_tbQuantity" );
                        try
                        {
                            // изменяем количество в строке
                            int newQty = string.IsNullOrEmpty( TB.Text ) ? 0 : Convert.ToInt32( TB.Text );
                            int oldQty = CIREQ.quantity;
                            if ( newQty == 0 )
                            {
                                rowsERQty.Remove( CIREQ );
                            }
                            else
                            {
                                CIREQ.quantity = newQty;
                            }
                            // Добавляем отброшенное количество в список ошибок
                            if ( oldQty != newQty )
                            {
                                rowsER.Add( new CartImportRowError()
                                {
                                    order = 10,
                                    error =  Resources.CartImport.CancelingInOrder + /*"отменено в заказе: "*/ ": " + CIREQ.errorText,
                                    manufacturer = CIREQ.manufacturer,
                                    partNumber = CIREQ.partNumber,
                                    supplierId = CIREQ.supplierId.ToString(),
                                    priceClient = CIREQ.priceClient.ToString( new NumberFormatInfo() { NumberDecimalSeparator = "," } ),
                                    quantity = ( oldQty - newQty ).ToString(),
                                    referenceID = CIREQ.referenceID,
                                    rowN = CIREQ.rowN,
                                    strictlyThisNumber = CIREQ.strictlyThisNumber ? Resources.Texts.Yes/*"да"*/ : Resources.Texts.No/*"нет"*/
                                } );
                            }
                        }
                        catch
                        {
                        }
                    }
                }

                // Собираем сумарные остатки
                Dictionary<SparePartPriceKey, int> groupRows = new Dictionary<SparePartPriceKey, int>();
                var DC = new DCFactory<StoreDataContext>();
                foreach ( CartImportRowERQty rERQty in rowsERQty )
                {
                    SparePartPriceKey SPPK = new SparePartPriceKey( rERQty.manufacturer, rERQty.partNumber, rERQty.supplierId );
                    if ( groupRows.ContainsKey( SPPK ) )
                    {
                        groupRows[SPPK] += rERQty.quantity;
                    }
                    else
                    {
                        groupRows.Add( SPPK, rERQty.quantity );
                    }
                }
                // количественная проверка с новой простановкой статусов
                // может уже поплыло по другим показателям
                foreach ( SparePartPriceKey SPPK in groupRows.Keys )
                {
                    string errorText = "";
                    SparePartFranch part = null;
                    if (SiteContext.Current.InternalFranchName == "rmsauto")
                    {
                        part = SparePartsDac.Load(DC.DataContext, SPPK);
                    }
                    else
                    {
                        part = SparePartsDacFranch.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 ) )
                    {
                        // при отсутсвии ошибок переносим в положительные списки
                        FromERQty( SPPK );
                    }
                    else
                    {
                        // обновляем текст ошибки
                        rowsERQty.Where( t => t.manufacturer == SPPK.Mfr && t.partNumber == SPPK.PN && t.supplierId == SPPK.SupplierId )
                            .Each( t => t.errorText = errorText );
                    }
                }
            }
            if ( rowsERQty.Count == 0 )
            {
                UpdateListViews();
                _multiViewLoadReport.ActiveViewIndex = 2;
            }
            else
            {
                UpdateERQtyList();
            }
        }
Exemple #19
0
        static OrderResult SendOrder( OrderLineItemSource[] items )
        {
            // Сопоставление сертификата (сертификат 'замаплен' на доменную учетку) и учетки на сайте
            string acctgId = ServiceAccountDac.GetClientIDByWcfServiceAccount( "RMS-AUTO\\franch01" );
            //подгружаем данные о клиенте
            ClientProfile profile = ClientProfile.Load( acctgId );
            RmsAuto.Acctg.ClientGroup clientGroup = profile.ClientGroup;
            decimal personalMarkup = profile.PersonalMarkup;

            //Dictionary<int, string> infos = new Dictionary<int, string>();
            List<OrderItemResult> infos = new List<OrderItemResult>();
            List<OrderLine> orderLines = new List<OrderLine>();
            bool existSuccesItems = false;
            foreach (var line in items)
            {
                StoreDataContext DC = new StoreDataContext();
                //подгружаем инфу о детали
                SparePartPriceKey key = new SparePartPriceKey( line.Manufacturer, line.PartNumber, line.SupplierID );

                var part = SparePartsDac.Load( DC, key );
                if (part == null)
                {
                    infos.Add(
                        new OrderItemResult()
                        {
                            ItemID = line.ItemID,
                            ResultInfo = "Запчасть не найдена.",
                            ResultCode = 2
                        } );
                }
                else if (line.Qty < part.DefaultOrderQty)
                {
                    infos.Add(
                        new OrderItemResult()
                        {
                            ItemID = line.ItemID,
                            ResultInfo = string.Format( "Минимальное количество для заказа: {0}.", part.DefaultOrderQty ),
                            ResultCode = 3
                        } );
                }
                else if (line.Qty % part.DefaultOrderQty != 0)
                {
                    infos.Add(
                        new OrderItemResult()
                        {
                            ItemID = line.ItemID,
                            ResultInfo = "Количество должно быть кратным числу деталей в комплекте.",
                            ResultCode = 4
                        } );
                }
                else if (part.QtyInStock.GetValueOrDefault() > 0 && line.Qty > part.QtyInStock)
                {
                    infos.Add(
                        new OrderItemResult()
                        {
                            ItemID = line.ItemID,
                            ResultInfo = string.Format( "Заказанное количество превышает остатки склада, доступно: {0}.", part.QtyInStock ),
                            ResultCode = 5
                        } );
                }
                else
                {
                    OrderLine ol = new OrderLine()
                    {
                        AcctgOrderLineID = -line.ItemID, //временный ID пока УС не обработает заказ и не проставит свой ID
                        Manufacturer = part.Manufacturer,
                        PartNumber = part.PartNumber,
                        SupplierID = part.SupplierID,
                        ReferenceID = line.ReferenceID,
                        DeliveryDaysMin = part.DeliveryDaysMin,
                        DeliveryDaysMax = part.DeliveryDaysMax,
                        PartName = part.PartName,
                        PartDescription = part.PartDescription,
                        WeightPhysical = part.WeightPhysical,
                        WeightVolume = part.WeightVolume,
                        UnitPrice = part.GetFinalSalePrice( clientGroup, personalMarkup ),
                        Qty = line.Qty,
                        StrictlyThisNumber = line.StrictlyThisNumber,
                        VinCheckupData = string.Empty,
                        OrderLineNotes = string.Empty,
                        CurrentStatus = OrderLineStatusUtil.StatusByte( "PreOrder" )
                    };
                    orderLines.Add( ol );

                    infos.Add(
                        new OrderItemResult()
                        {
                            ItemID = line.ItemID,
                            ResultInfo = "Позиция принята успешно.",
                            ResultCode = 1
                        } );
                    existSuccesItems = true;
                }
            }
            ////если нет ни одной ошибки, то размещаем заказ
            //int? orderID = null;
            //if (infos.Count == 0)
            //{
            int? orderID = null;
            if (existSuccesItems)
            {
                orderID = OrderBO.CreateOrderForService(profile.UserId, profile.ClientId, "1", orderLines, "123" );
            }
            //}
            OrderResult result = new OrderResult()
            {
                OrderID = orderID,
                ItemResults = infos.ToArray()
            };
            return result;
        }