// GET: AlcoholLicense public ActionResult Index() { var model = licenseRepo.GetItems(); return(View(model)); }
/// <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)); }