예제 #1
0
        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"));
        }
예제 #2
0
        /// <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));
        }