public void Post([FromBody] RawMaterial material)
		{
			Argument.NotNull(material, "Material is required.");

			using (var storage = new Storage())
			{
				var existingMaterial = storage
					.RawMaterials
					.SingleOrDefault(rm => rm.RawMaterialId == material.RawMaterialId);

				if (null != existingMaterial)
				{
					storage.Update(material);
				}
				else
				{
					storage.Insert(material);
				}
			}
		}
		public RawMaterialType Post([FromBody] RawMaterialType rawMaterialType)
		{
			Argument.NotNull(rawMaterialType, "Price extra category is required.");

			using (var storage = new Storage())
			{
				var existingMaterial = storage
					.RawMaterialTypes
					.SingleOrDefault(rmt => rmt.RawMaterialTypeId == rawMaterialType.RawMaterialTypeId);

				if (null != existingMaterial)
				{
					storage.Update(rawMaterialType);
				}
				else
				{
					storage.Insert(rawMaterialType);
				}

				return rawMaterialType;
			}
		}
		public PriceExtraCategory Post([FromBody] PriceExtraCategory priceExtraCategory)
		{
			Argument.NotNull(priceExtraCategory, "Price extra category is required.");

			using (var storage = new Storage())
			{
				var existingCategory = storage
					.PriceExtraCategories
					.SingleOrDefault(pc => pc.PriceExtraCategoryId == priceExtraCategory.PriceExtraCategoryId);

				if (null != existingCategory)
				{
					storage.Update(priceExtraCategory);
				}
				else
				{
					storage.Insert(priceExtraCategory);
				}

				return priceExtraCategory;
			}
		}
		public void Post([FromBody] Manufacturer manufacturer)
		{
			Argument.NotNull(manufacturer, "Manufacturer is required.");

			if (manufacturer.IsPrimary)
				return;

			using (var storage = new Storage())
			{
				var existingManufacturer = storage
					.Manufacturers
					.SingleOrDefault(m => m.ManufacturerId == manufacturer.ManufacturerId);

				if (null != existingManufacturer)
				{
					storage.Update(manufacturer);
				}
				else
				{
					storage.Insert(manufacturer);
				}

			}
		}
		public void Seed(Storage storage, int plantCode)
		{
			storage.Insert(new Manufacturer { Name = "ЧерМК", IsPrimary = true });
			storage.Insert(new Manufacturer { Name = "НЛМК", IsPrimary = true });
			storage.Insert(new Manufacturer { Name = "ММК", IsPrimary = true });
			//storage.Insert(new Manufacturer { Name = "(1) КТЗ", IsPrimary = false });
			//storage.Insert(new Manufacturer { Name = "(1) РязТЗ", IsPrimary = false });
			//storage.Insert(new Manufacturer { Name = "(1) БТЗ", IsPrimary = false });
			//storage.Insert(new Manufacturer { Name = "(1) ОМК", IsPrimary = false });
			//storage.Insert(new Manufacturer { Name = "(1) СЗТЗ", IsPrimary = false });
			//storage.Insert(new Manufacturer { Name = "(1) ТПК Союз", IsPrimary = false });
			//storage.Insert(new Manufacturer { Name = "(1) Машпрофиль", IsPrimary = false });
			//storage.Insert(new Manufacturer { Name = "(1) Профиль А", IsPrimary = false });
			//storage.Insert(new Manufacturer { Name = "(1) БИС", IsPrimary = false });

			storage.Insert(new Manufacturer { Name = "(2) ВестМет", IsPrimary = false });
			//storage.Insert(new Manufacturer { Name = "(2) Промизделия", IsPrimary = false });
			storage.Insert(new Manufacturer { Name = "(2) ТЭМПО", IsPrimary = false });
			//storage.Insert(new Manufacturer { Name = "(2) ОМК", IsPrimary = false });
			//storage.Insert(new Manufacturer { Name = "(2) ТМК", IsPrimary = false });
			//storage.Insert(new Manufacturer { Name = "(2) Уралтрубпром", IsPrimary = false });
			//storage.Insert(new Manufacturer { Name = "(2) Исаевский ТЗ", IsPrimary = false });

			storage.Insert(new PriceExtraCategory { Name = "Себестоимость" });
			storage.Insert(new PriceExtraCategory { Name = "Доставка материала" });
			storage.Insert(new PriceExtraCategory { Name = "Передел" });
			storage.Insert(new PriceExtraCategory { Name = "Доставка до Москвы" });

			var allManufacturers = storage
				.Manufacturers
				.ToList();

			var primaryManufacturers = allManufacturers.Where(m => m.IsPrimary);
			var nonPrimaryManufacturers = allManufacturers.Where(m => !m.IsPrimary);

			var materialThickness = EnumerateThickness(plantCode);

			foreach (var thickness in materialThickness)
			{
				foreach (var rollType in new [] {RollType.Cold, RollType.Hot })
				{
					foreach (var alloyType in new[] {AlloyType.LowAlloy, AlloyType.Regular })
					{
						var materialType = new RawMaterialType
						{
							AlloyType = alloyType,
							RollType = rollType,
							Thickness = thickness,
						};

						SetMaterialTypeName(materialType);

						var materialTypeId = storage.InsertWithIdentity(materialType);

						foreach (var primaryManufacturer in primaryManufacturers)
						{
							var rawMaterialId = storage.InsertWithIdentity(
								new RawMaterial
								{
									ManufacturerId = primaryManufacturer.ManufacturerId,
									RawMaterialTypeId = Convert.ToInt32(materialTypeId),
								});

							foreach (var productName in EnumerateProductNames(plantCode, rollType, alloyType))
							{
								storage.Insert(
									new Product
									{
										ManufacturerId = primaryManufacturer.ManufacturerId,
										RawMaterialId = Convert.ToInt32(rawMaterialId),
										Name = productName,
										Thickness = thickness,
									});


								foreach (var nonPrimaryManufacturer in nonPrimaryManufacturers)
								{
									storage.Insert(
										new Product
										{
											ManufacturerId = nonPrimaryManufacturer.ManufacturerId,
											RawMaterialId = Convert.ToInt32(rawMaterialId),
											Name = productName,
											Thickness = thickness,
										});
								}
								
							}
						}
					}
				}
			}
		}
		public void Post([FromBody] Product product)
		{
			Argument.NotNull(product, "Product is required.");

			using (var storage = new Storage())
			{
				var existingProduct = storage
					.Products
					.SingleOrDefault(p => p.ProductId == product.ProductId);

				if (null != existingProduct)
				{
					storage.Update(product);
				}
				else
				{
					storage.Insert(product);
				}
			}
		}
		public void ServiceShouldCreateProducts()
		{
			using (var storage = new Storage())
			{
				// RawMaterialTypeId = 1
				storage.Insert(
					new RawMaterialType
					{
						RawMaterialTypeId = 1,
						AlloyType = AlloyType.Regular,
						RollType = RollType.Undefined,
						Name = "Штрипс",
						Thickness = 10,
					});

				

				// PriceExtraCategoryId = 1
				storage.Insert(
					new PriceExtraCategory
					{
						Name = "Доставка"
					});

				// PriceExtraCategoryId = 2
				storage.Insert(
					new PriceExtraCategory
					{
						Name = "Передел"
					});

				// ManufacturerId = 1
				storage.Insert(
					new Manufacturer
					{
						Name = "Главный Производитель",
						IsPrimary = true,
					});

				// ManufacturerId = 1
				storage.Insert(
					new Manufacturer
					{
						Name = "Субпроизводитель",
						IsPrimary = false,
					});

				// RawMaterialId = 1,
				storage.Insert(
					new RawMaterial
					{
						ManufacturerId = 1,
						RawMaterialTypeId = 1,
					});
			}

			var service = new ProductService();
			var product = service.CreateProduct(2, 1, "10x10", 2);

			var extra1 = service.AddPriceExtra(product.ProductId, 1);
			var extra2 = service.AddPriceExtra(product.ProductId, 2);

			service.SetMaterialPrice(1, 2, new DateTime(2015, 1, 1), 100);
			service.SetExtraPrice(extra1.PriceExtraId, 2, new DateTime(2015, 1, 1), 200);
			service.SetExtraPrice(extra2.PriceExtraId, 2, new DateTime(2015, 1, 2), 300);

			var price1 = service.GetProductWithPrice(product.ProductId).Price;

			service.SetMaterialPrice(1, 2, new DateTime(2015, 4, 1), 150);
			service.SetExtraPrice(extra1.PriceExtraId, 2, new DateTime(2015, 3, 1), 400);

			var price2 = service.GetProductWithPrice(product.ProductId).Price;

			Assert.AreEqual(600, price1);
			Assert.AreEqual(850, price2);

		}
Exemple #8
0
		public void SetExtraPrice(int priceExtraId, int ownerId, DateTime date, decimal? price)
		{
			Argument.Require(priceExtraId > 0, "Price extra id is required.");
			Argument.Require(ownerId > 0, "Owner id is required.");
			Argument.Require(date > DateTime.MinValue, "Price date is required.");
			Argument.Require(null == price || price.Value >= 0, "Price should be >= 0");

			using (var storage = new Storage())
			{
				var priceExtra = storage
					.PriceExtras
					.SingleOrDefault(pe => pe.PriceExtraId == priceExtraId);

				if(null == priceExtra)
					throw new InvalidOperationException($"Price extra with id {priceExtraId} not found.");

				var existingPriceItem = storage
					.PriceItems
					.SingleOrDefault(pi => pi.PriceExtraId == priceExtraId && pi.OwnerId == ownerId && pi.Date == date);

				if (null != existingPriceItem)
				{
					existingPriceItem.Price = price;
					storage.Update(existingPriceItem);
				}
				else
				{
					var priceItem = new PriceItem
					{
						ProductId = priceExtra.ProductId,
						PriceType = PriceType.PriceExtra,
						PriceExtraId = priceExtraId,
						Date = date,
						OwnerId = ownerId,
						Price = price,
					};

					storage.Insert(priceItem);
				}

				UpdatePriceCache(storage, priceExtra.ProductId, date);
			}
		}
Exemple #9
0
		public void SetRetailPrice(int productId, DateTime date, decimal? price)
		{
			Argument.Require(productId > 0, "Price extra id is required.");
			Argument.Require(date > DateTime.MinValue, "Price date is required.");
			Argument.Require(null == price || price.Value >= 0, "Price should be >= 0");

			using (var storage = new Storage())
			{
				var product = storage
					.Products
					.LoadWith(p => p.RawMaterial.RawMaterialType)
					.SingleOrDefault(pe => pe.ProductId == productId);

				if (null == product)
					throw new InvalidOperationException($"Product with id {productId} not found.");

				var alloyType = product.RawMaterial.RawMaterialType.AlloyType;
				var rollType = product.RawMaterial.RawMaterialType.RollType;

				if (alloyType == AlloyType.Undefined
					|| rollType == RollType.Undefined)
				{
					throw new InvalidOperationException("Для сохранения цен поля Тип проката и Тип продукта обязательны.");
				}


				var existingPriceItem = storage
					.PriceItems
					.SingleOrDefault(
						pi =>
							pi.PriceType == PriceType.RetailPrice
								&& pi.Product.RawMaterial.RawMaterialType.AlloyType == alloyType
								&& pi.Product.RawMaterial.RawMaterialType.RollType == rollType
								&& pi.Product.Thickness == product.Thickness
								&& pi.Product.Name == product.Name
					);
					

				if (null != existingPriceItem)
				{
					existingPriceItem.Price = price;
					storage.Update(existingPriceItem);
				}
				else
				{
					var priceItem = new PriceItem
					{
						PriceType = PriceType.RetailPrice,
						ProductId = productId,
						Date = date,
						Price = price,
					};

					storage.Insert(priceItem);
				}

				UpdatePriceCache(storage, productId, date);
			}
		}
Exemple #10
0
		public void SetMaterialPrice(int rawMaterialId, int ownerId, DateTime date, decimal? price)
		{
			Argument.Require(rawMaterialId > 0, "Raw material identifier is required.");
			Argument.Require(ownerId > 0, "Owner identifier is required.");
			Argument.Require(date > DateTime.MinValue, "Date is required.");
			Argument.Require(null == price || price.Value >= 0, "Price should be >= 0.");

			using (var storage = new Storage())
			{
				var priceExtra = storage
					.RawMaterials
					.SingleOrDefault(pe => pe.RawMaterialId == rawMaterialId);

				if (null == priceExtra)
					throw new InvalidOperationException($"Raw material with id {rawMaterialId} not found.");

				var existingPriceItem = storage
					.PriceItems
					.SingleOrDefault(pi => pi.RawMaterialId == rawMaterialId && pi.OwnerId == ownerId && pi.Date == date);

				if (null != existingPriceItem)
				{
					existingPriceItem.Price = price;
					storage.Update(existingPriceItem);
				}
				else
				{
					var priceItem = new PriceItem
					{
						PriceType = PriceType.RawMaterial,
						RawMaterialId = rawMaterialId,
						Date = date,
						OwnerId = ownerId,
						Price = price,
					};

					storage.Insert(priceItem);
				}

				var products = storage
					.Products
					.Where(product => product.ManufacturerId == ownerId && product.RawMaterialId == rawMaterialId)
					.Select(p => p.ProductId)
					.ToList();

				foreach (var productId in products)
				{
					UpdatePriceCache(storage, productId, date);
				}
			}
		}