protected string GetSparePartDetailsUrl(SparePartFranch sparePart) { SparePartPriceKey key = new SparePartPriceKey( sparePart.Manufacturer, sparePart.PartNumber, sparePart.SupplierID); return UrlManager.GetSparePartDetailsUrl(key.ToUrlString()); }
//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; } }
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); } } } }
//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(); }
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 ) ); } }
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(); } }
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; }