// GET: Orders
        public ActionResult NewOrder()
        {
            var orderView = new OrderView();
            orderView.Customer = new Customer();
            orderView.ProductOrders = new List<ProductOrder>();

            //Utilizo session para guardar los datos, en el viwbag no los puedo guuardar porque es efimero,
            // solo muestra los datos y no los gretiene o guarda:
            Session["orderView"] = orderView;//Almaceno los datos: 

            //para mandar la lista a los cientes:
            var list = db.Customers.ToList();
            list.Add(new Customer { CustomerId = 0, FirstName = "[Seleccione un Cliente.....]"});
            ViewBag.CustomerId = new SelectList(list.OrderBy(c => c.LastName), "CustomerId", "FullName");
          

            return View(orderView);
        }
        public ActionResult NewOrder(OrderView orderView)
        {
            //Recupero o leo los datos(objetos) del la session:
             orderView = Session["orderView"] as OrderView;//hago un casting
             
            var customerId = int.Parse(Request["CustomerId"]);

            if (customerId == 0)
            {
                //para mandar la lista a los cientes:
                var list1 = db.Customers.ToList();
                list1.Add(new Customer { CustomerId = 0, FirstName = "[Seleccione un Cliente.....]" });
                ViewBag.CustomerId = new SelectList(list1.OrderBy(c => c.LastName), "CustomerId", "FullName");  
                 ViewBag.Error = "Debe Seleccionar un Cliente.....";
                
                return View(orderView);
            }

            var customer = db.Customers.Find(customerId);
            if (customer == null)
            {
                //para mandar la lista a los cientes:
                var list1 = db.Customers.ToList();
                list1.Add(new Customer { CustomerId = 0, FirstName = "[Seleccione un Cliente.....]" });
                ViewBag.CustomerId = new SelectList(list1.OrderBy(c => c.LastName), "CustomerId", "FullName");

                ViewBag.Error = "El Cliente no Existe.....";
                
                return View(orderView);
            }
            //validando detalles del producto: lo tienen que seleccionar
            if (orderView.ProductOrders.Count == 0)
            {
                //para mandar la lista a los cientes:
                var list1 = db.Customers.ToList();
                list1.Add(new Customer { CustomerId = 0, FirstName = "[Seleccione un Cliente.....]" });
                ViewBag.CustomerId = new SelectList(list1.OrderBy(c => c.LastName), "CustomerId", "FullName");

                ViewBag.Error = "Debe Ingresar Detalle del Producto.....";

                return View(orderView);
            }

            var orderId = 0;
            //Manejo transacsional:
            //Start Transction:
            //Inyectar error para prueba de la transaction:
            int i = 0;
            using (var transaction = db.Database.BeginTransaction())
            {
                try
                {
                    var order = new Order
                    {
                        CustomerId = customerId,
                        OrderDate = DateTime.Now,
                        OrderStatus = OrderStatus.Created
                    };

                    db.Orders.Add(order);
                    db.SaveChanges();

                    //onsulta linq para obtner el maximo de la tabla orders:
                    orderId = db.Orders.ToList().Select(o => o.OrderId).Max();

                    foreach (var item in orderView.ProductOrders)
                    {
                        var orderDetail = new OrderDetail
                        {
                            ProductId = item.ProductId,
                            Descripcion = item.Descripcion,
                            Price = item.Price,
                            Quantity = item.Quantity,
                            OrderId = orderId
                        };

                        db.OrderDetails.Add(orderDetail);
                        db.SaveChanges();

                        //Error provocado para probar transaction
                        //i++;
                        //if (i > 2)
                        //{
                        //    int a = 0;
                        //    i /= a;

                        //}

                    }

                    //Confirmo la transaction;
                    transaction.Commit();

                }
                catch (Exception ex)
                {

                    transaction.Rollback();
                    ViewBag.Error = "ERROR: " + ex.Message;
                  

                    //para mandar la lista a los cientes:
                    var listC = db.Customers.ToList();
                    listC.Add(new Customer { CustomerId = 0, FirstName = "[Seleccione un Cliente.....]" });
                    ViewBag.CustomerId = new SelectList(listC.OrderBy(c => c.LastName), "CustomerId", "FullName");

                    return View(orderView);
                }     

           
          }//end Transaction

            ViewBag.Message = string.Format("La orden: {0}, Grabada OK.", orderId);

            //para mandar la lista a los cientes:
            var list = db.Customers.ToList();
            list.Add(new Customer { CustomerId = 0, FirstName = "[Seleccione un Cliente.....]" });
            ViewBag.CustomerId = new SelectList(list.OrderBy(c => c.LastName), "CustomerId", "FullName");

            orderView = new OrderView();
            orderView.Customer = new Customer();
            orderView.ProductOrders = new List<ProductOrder>();
            Session["orderView"] = orderView;

            return View(orderView);
        }