public PriceExtra AddPriceExtra(int productId, int priceExtraCategoryId) { Argument.Require(productId > 0, "Product identifier is required."); Argument.Require(priceExtraCategoryId > 0, "Price extra category id is required."); var priceExtra = new PriceExtra { PriceExtraCategoryId = priceExtraCategoryId, ProductId = productId, }; using (var storage = new Storage()) { var existingExtra = storage .PriceExtras .SingleOrDefault(pe => pe.ProductId == productId && pe.PriceExtraCategoryId == priceExtraCategoryId); if (null == existingExtra) { priceExtra.PriceExtraId = Convert.ToInt32(storage.InsertWithIdentity(priceExtra)); } else { priceExtra.PriceExtraId = existingExtra.PriceExtraId; } } return(priceExtra); }
public BulkProductParseResult ParseExtraPricesBulk( int manufacturerId, int supplierId, DateTime date, AlloyType alloyType, RollType rollType, int priceExtraCategoryId, bool remove, string raw) { var products = new List <Product>(); var errors = new List <string>(); if (remove) { raw = "0"; } try { var lines = raw.Split(new [] { '\n' }, StringSplitOptions.RemoveEmptyEntries); var headers = lines[0].Split('\t'); using (var storage = new Storage()) { if (lines.Length == 1 && headers.Length == 1) { var price = Convert.ToDecimal(raw.Trim().FixDecimalSeparator()); return(new BulkProductParseResult { Errors = new string[0], Products = storage .Products .Where( p => p.ManufacturerId == manufacturerId && p.RawMaterial.ManufacturerId == supplierId && (alloyType == AlloyType.Undefined || p.RawMaterial.RawMaterialType.AlloyType == alloyType) && (rollType == RollType.Undefined || p.RawMaterial.RawMaterialType.RollType == rollType) ) .ToList() .Select( p => { p.PriceExtras = new[] { new PriceExtra { PriceExtraCategoryId = priceExtraCategoryId, PriceItems = new[] { new PriceItem { Date = date, OwnerId = manufacturerId, Price = price, } } } }; return p; }) .ToArray() }); } for (int lineId = 1; lineId < lines.Length; lineId++) { var prices = lines[lineId].Split('\t'); var productName = prices[0].Trim(); for (int colId = 1; colId < headers.Length; colId++) { var thickness = Convert.ToDecimal(headers[colId].FixDecimalSeparator()); var query = storage .RawMaterials .LoadWith(rm => rm.RawMaterialType) .Where( rm => rm.ManufacturerId == supplierId && rm.RawMaterialType.Thickness == thickness); if (alloyType != AlloyType.Undefined) { query = query.Where(rm => rm.RawMaterialType.AlloyType == alloyType); } if (rollType != RollType.Undefined) { query = query.Where(rm => rm.RawMaterialType.RollType == rollType); } var rawMaterials = query.ToList(); if (!rawMaterials.Any()) { errors.Add($"Выбранный поставщик не производит материала с такими параметрами и толщиной {thickness}"); continue; } foreach (var rawMaterial in rawMaterials) { var product = storage .Products .SingleOrDefault( p => p.ManufacturerId == manufacturerId && p.RawMaterialId == rawMaterial.RawMaterialId && p.Name == productName); if (null == product) { product = new Product { ManufacturerId = manufacturerId, RawMaterialId = rawMaterial.RawMaterialId, Thickness = rawMaterial.RawMaterialType.Thickness, Name = productName, }; } var priceExtra = new PriceExtra { PriceExtraCategoryId = priceExtraCategoryId, ProductId = product.ProductId, }; var price = string.IsNullOrEmpty(prices[colId]) ? null : (decimal?)Convert.ToDecimal(prices[colId].FixDecimalSeparator()); var priceItem = new PriceItem { OwnerId = manufacturerId, Date = date, Price = remove ? null : price, }; priceExtra.PriceItems = new[] { priceItem }; product.PriceExtras = new[] { priceExtra }; products.Add(product); if (!string.IsNullOrEmpty(prices[colId])) { } } } } } } catch (Exception ex) { _logger.Error(ex); errors.Add("Ошибка синтаксического разбора строки."); } return(new BulkProductParseResult { Errors = errors.ToArray(), Products = errors.Any() ? new Product[0] : products.ToArray() }); }
public void Post([FromBody] PriceExtra extra) { Argument.NotNull(extra, "Price extra is required."); ProductService.AddPriceExtra(extra.ProductId, extra.PriceExtraCategoryId); }