public ActionResult UploadJson(OrderUploadVM model) { byte[] data; if (model.File == null) { ModelState.AddModelError("NullFile", "Inget filnamn angivet"); return(View()); } using (MemoryStream ms = new MemoryStream()) { model.File.InputStream.CopyTo(ms); data = ms.ToArray(); } var json = Encoding.Default.GetString(data); JObject jCustomerOrder = JObject.Parse(json); var items = customerAddressRepo.GetItems(); var cid = (string)jCustomerOrder["customerid"]; var aid = (string)jCustomerOrder["addressid"]; var customerAddress = customerAddressRepo.GetItems().Where( a => a.AddressType == AddressType.Leverans && a.Address.AddressOrderId == aid && a.Customer.CustomerOrderId == cid).SingleOrDefault(); if (customerAddress == null) { ModelState.AddModelError("", $"Kundorderid: '{cid}' eller Adressorderid: '{aid}' är felaktigt."); return(View()); } var customer = customerAddress.Customer; var allProducts = productRepo.GetItems(); string dStr = (string)jCustomerOrder["date"]; DateTime dDate; if (dStr.Length < 1) { dDate = DateTime.Now; } else if (!DateTime.TryParse(dStr, out dDate)) { ModelState.AddModelError("", $"Önskad leveransdatum: '{dStr}' är felaktigt."); return(View()); } var order = new Order { CustomerId = customerAddress.Customer.Id, AddressId = customerAddress.Address.Id, OrderDate = DateTime.Today, DesiredDeliveryDate = dDate, Comment = (string)jCustomerOrder["comment"] }; if (customer != null) { var firstPossibleDate = DateTime.Today.AddDays(customer.DaysToDelievery); order.PlannedDeliveryDate = (order.DesiredDeliveryDate.CompareTo(firstPossibleDate) <= 0) ? firstPossibleDate : order.DesiredDeliveryDate; } var jProducts = jCustomerOrder["products"].ToArray(); foreach (var jProduct in jProducts) { var prodString = (string)jProduct["pno"]; var product = productRepo.GetItem(prodString); if (product == null) { ModelState.AddModelError("", $"Produktorderid: '{prodString}' finns inte."); return(View()); } var aStr = (string)jProduct["amount"]; uint oa; if (!uint.TryParse(aStr, out oa)) { ModelState.AddModelError("", $"Beställt antal: '{aStr}' är felaktigt."); return(View()); } if (oa < 1) { ModelState.AddModelError("", $"Beställt antal: '{aStr}' mindre än 1."); return(View()); } var orderProduct = new OrderProduct { OrderId = order.Id, Comment = (string)jProduct["comment"], ProductId = productRepo.GetItem((string)jProduct["pno"]).Id, OrderedAmount = (int)oa }; order.OrderProducts.Add(orderProduct); } var existingOrders = orderRepo.GetItems().Where(o => o.AddressId == order.AddressId && o.CustomerId == order.CustomerId); foreach (var item in existingOrders) { if (item.DesiredDeliveryDate.Equals(order.DesiredDeliveryDate) && item.Comment.Equals(order.Comment)) { ModelState.AddModelError("", "En order med samma kundorderid, adressorderid och önskat leveransdatum är redan registrerad."); return(View()); } } orderRepo.CreateItem(order); //foreach (var item in order.OrderProducts) //{ // orderProductRepo.CreateItem(item); //} //orderRepo.HandleOrder(order); return(RedirectToAction("Index", "Orders")); }
/// <summary> /// Förbereder order med produkterna i en viewmodel innan man går vidare att skapa en plocksedel. /// </summary> /// <param name="id"></param> /// <returns></returns> public ActionResult PrepareOrder(int?id) { if (id == null) { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); } var order = orderRepo.GetItem((int)id); if (order == null) { return(HttpNotFound()); } var orderVM = new OrderVM { Id = order.Id, OrderDate = order.OrderDate, CustomerId = order.CustomerId, PlannedDeliveryDate = order.PlannedDeliveryDate, AddressId = order.AddressId, Comment = order.Comment }; // Kolla alkolicens if (licenseRepo.GetItems().SingleOrDefault(x => x.CustomerId == order.CustomerId && x.StartDate.CompareTo(order.OrderDate) <= 0 && x.EndDate.CompareTo(order.OrderDate) >= 0) == null) { ModelState.AddModelError("", "Kunden har ingen alkohollicens."); orderVM.CannotContinueRegsitration = true; } var priceList = priceListRepository.GetItems().Where(x => x.CustomerGroupId == order.Customer.CustomerGroupId); var orderProductVMs = new List <OrderProductVM>(); var backOrder = new Order { CustomerId = order.CustomerId, AddressId = order.AddressId, Comment = "*Restorder* " + order.Comment, OrderDate = DateTime.Now.Date, DesiredDeliveryDate = order.DesiredDeliveryDate, OrderStatus = OrderStatus.Behandlar, OrderProducts = new List <OrderProduct>() }; // Kolla lagersaldot och försök att reservera. foreach (var op in order.OrderProducts) { // Kolla om produkten säljs. if (op.Product.ProductStatus != ProductStatus.Normal) { backOrder.OrderProducts.Add(CreateBackOrder(op)); continue; } // Försök att reservera om det går. ReserveItem(op); // Få fram plockordrar på nytt. var pickList = pickingOrderRepo.GetItems().Where(x => x.OrderProductId == op.Id); // Ta fram reserverat antal och uppdatera availableAmount op.AvailabeAmount = pickList.Sum(x => x.ReservedAmount); orderProductRepo.UpdateItem(op); // Räkna fram priset. float productTotalPrice = 0; float unitPrice = 0; var productPrice = priceList.SingleOrDefault(x => x.ProductId == op.ProductId); if (productPrice == null) { ModelState.AddModelError("", $"Kunden har inget pris för {op.Product.ShortDescription}."); orderVM.CannotContinueRegsitration = true; } else { var limit = 0; switch (productPrice.Product.StoragePackage) { case StoragePackage.Back: limit = 384; break; case StoragePackage.Kartong: limit = 240; break; case StoragePackage.Flak: limit = 480; break; } unitPrice = productPrice.Price * (op.AvailabeAmount > limit ? (1 - productPrice.RebatePerPallet * .01f) : 1); productTotalPrice = op.AvailabeAmount * unitPrice; } // Om man har lyckats reservera varor i lagret. if (op.AvailabeAmount > 0) { var opvm = new OrderProductVM { Id = op.Id, ProductId = (int)op.ProductId, OrderedAmount = op.OrderedAmount, AvailabeAmount = op.AvailabeAmount, Price = productTotalPrice, UnitPrice = unitPrice, Comment = op.Comment }; orderProductVMs.Add(opvm); // Skapa rest order om lagret inte har tillräckligt många varor. if (op.OrderedAmount > op.AvailabeAmount) { // Sparar undan restorder tills vidare. backOrder.OrderProducts.Add(CreateBackOrder(op)); // Uppdatera beställt antal till det reserverade eftersom resten finns på restorder. op.OrderedAmount = op.AvailabeAmount; // Uppdatera databasen. orderProductRepo.UpdateItem(op); } } } orderVM.OrderProducts = orderProductVMs; // Jämför kreditgräns. var totalPrice = orderProductVMs.Sum(x => x.Price); if (order.Customer.CreditLimit != -1 && totalPrice > order.Customer.CreditLimit) { orderVM.CannotContinueRegsitration = true; ModelState.AddModelError("Price", $"Kundens kredigräns är överstigen ({order.Customer.CreditLimit})."); } orderVM.Price = totalPrice; if (totalPrice == 0) { orderVM.CannotContinueRegsitration = true; ModelState.AddModelError("", "Det finns ingen plockorder att skapa."); } else { if (backOrder.OrderProducts.Count > 0) { orderRepo.CreateItem(backOrder); ModelState.AddModelError("", "Restorder har genererats."); } } return(View(orderVM)); }