public ActionResult Create()
 {
     var compraNueva = new ProductoSucursal();
     ViewBag.Productos = db.Productos.OrderBy(p => p.Nombre);
     ViewBag.Sucursales = db.Sucursales.OrderBy(s => s.Nombre);
     return View(compraNueva);
 }
        public ActionResult Create(ProductoSucursal newPS)
        {
            ViewBag.Productos = db.Productos.OrderBy(p => p.Nombre);
            ViewBag.Sucursales = db.Sucursales.OrderBy(s => s.Nombre);

            if (ModelState.IsValid)
            {
                db.ProductosSucursal.Add(newPS);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return RedirectToAction("Http://www.google.com");
        }
        //
        // GET: /DefaultData/
        public ActionResult Index()
        {
            Cliente Cliente = new Cliente
            {
                CalleReceptor = "Cerrada Alvaro Obregon",
                CodigoPostalReceptor = "72760",
                ColoniaReceptor = "Fraccionamiento Horizontal El Campanario",
                Contacto = "Mane",
                Email = "*****@*****.**",
                EstadoReceptor = "Puebla",
                MunicipioReceptor = "San Pedro Cholula",
                NoExteriorReceptor = "2",
                NombreCliente = "Jose Manuel Heredia Hidalgo",
                NombreReceptor = "Jose Manuel Heredia Hidalgo",
                PaisReceptor = "México",
                RfcReceptor = "HEHM880429QG7",
                Telefono = "2222474817"

            };

            db.Clientes.Add(Cliente);

            Sucursal Sucursal = new Sucursal
            {
                Cuenta ="SEG0809151GA",
                DomicilioFiscal = "Blvd. Forjadores de Puebla #8A Colonia Manantiales. San Pedro Cholula, Puebla. CP 72760",
                Nombre = "Forjadores",
                Password ="******",
                RFC = "SEG0809151GA",
                Telefono = "22224847474"
            };

            db.Sucursales.Add(Sucursal);

            TryUpdateModel(Sucursal);

            Categoria Cat1 = new Categoria
            {
                Nombre = "Gases"
            };
            Categoria Cat2 = new Categoria
            {
                Nombre = "Soldadura"
            };

            db.Categorias.Add(Cat1);
            db.Categorias.Add(Cat2);

            Unidad u1 = new Unidad
            {
                Nombre = "Kg"
            };

            Unidad u2 = new Unidad
            {
                Nombre = "M3"
            };

            db.Unidades.Add(u1);
            db.Unidades.Add(u2);

            TryUpdateModel(Cat1);
            TryUpdateModel(Cat2);

            TryUpdateModel(u1);
            TryUpdateModel(u2);

            Producto p1 = new Producto
            {
                Activo = true,
                Clave = "SEGOX2011",
                Descripcion = "Oxigeno Industrial de 8.5",
                FotoUrl = "",
                IdCategoria = 1,
                IdUnidad = 1,
                Nombre = "Oxigeno Industrial de 8.5",
                PrecioLista = 88.9M
            };

            Producto p2 = new Producto
            {
                Activo = true,
                Clave = "SEGSOL2011",
                Descripcion = "Soldadura Grinox",
                FotoUrl = "",
                IdCategoria = 2,
                IdUnidad = 2,
                Nombre = "Soldadura Grinox",
                PrecioLista = 55.00M,
            };

            db.Productos.Add(p1);
            db.Productos.Add(p2);

            db.SaveChanges();

            ProductoSucursal ps1 = new ProductoSucursal
            {
                cantidad = 100.00M,
                IdProducto = 1,
                IdSucursal = 1,
                Producto = db.Productos.Find(1),
                Sucursal = db.Sucursales.Find(1)
            };

            ProductoSucursal ps2 = new ProductoSucursal
            {
                cantidad = 100.00M,
                IdProducto = 2,
                IdSucursal = 1,
                Producto = db.Productos.Find(2),
                Sucursal = db.Sucursales.Find(1)
            };

            db.ProductosSucursal.Add(ps1);
            db.ProductosSucursal.Add(ps2);

            db.SaveChanges();

            TryUpdateModel(p1);
            TryUpdateModel(p2);

            return View();
        }
        public ActionResult Details(int id, int x = 1)
        {
            var orden = db.OrdenesDeCompra.Find(id);
            if (permisoSucursal(orden.IdSucursal) == 0)
            {
                return RedirectToAction("Error", new { Error = "No puede aceptar el traslado ya que no cuenta con los permisos necesarios" });
            }

            //Actualizamos la orden de compra de acuerdo a la información dada
            foreach (var item in orden.Productos)
            {
                string label = "cantidad" + item.IdProducto;
                try
                {
                    decimal cantidad = decimal.Parse(Request.Form[label]);
                    item.cantidad = cantidad;
                }
                catch
                {
                    ViewBag.Sucursal = db.Sucursales.Find(orden.IdSucursal);
                    ViewBag.Proveedor = db.Proveedores.Find(orden.IdProveedor);
                    return View(orden);
                }
            }

            orden.Activa = false;
            orden.usuario = HttpContext.User.Identity.Name;
            OrdenDeCompra Orden = orden;
            /* Relacionamos al proveedor con el producto */
            foreach (ProductoOrden prod in Orden.Productos)
            {
               /*Buscamos si el producto ya había sido vendido por el proveedor*/
                List<Proveedor> Prove = db.Proveedores.Where(p => p.ID == Orden.ID && p.Productos.Any(pp => pp.ID == prod.ID)).ToList();

                if (Prove.Count == 0)
                {
                    //Creamos insertamos un proveedor a la lista de productos
                    var provedor = db.Proveedores.Find(Orden.IdProveedor);
                    var prodI = db.Productos.Find(prod.IdProducto);
                    if (provedor.Productos == null)
                        provedor.Productos = new List<Producto>();
                    if (prodI.Proveedores == null)
                        prodI.Proveedores = new List<Proveedor>();

                    provedor.Productos.Add(prodI);
                    prodI.Proveedores.Add(provedor);

                }
            }

            db.SaveChanges();

            //Ahora damos de alta los productos en el inventario

            foreach (var item in Orden.Productos)
            {
                try
                {

                    var Prod = db.ProductosSucursal.Single(p => p.IdProducto == item.IdProducto && p.IdSucursal == Orden.IdSucursal);
                    Prod.cantidad += item.cantidad;

                    //Generamos el movimiento

                    var Movimiento = new MovimientoAlmacen
                    {
                        Count = item.cantidad,
                        DescripcionMovimiento = "Alta por Orden de compra número " + Orden.ID,
                        FechaMovimiento = DateTime.Now,
                        IdOrednCompra = Orden.ID,
                        IdProducto = item.IdProducto,
                        IdSucursal = Orden.IdSucursal,
                        IdVenta = 0,
                        OrdenDeCompra = Orden,
                        Producto = item.Producto,
                        TipoMovimiento = "Ingreso"
                    };

                    db.MovimientosAlmacen.Add(Movimiento);

                    db.SaveChanges();

                }
                catch
                {
                    var Prod = new ProductoSucursal
                    {
                        cantidad = item.cantidad,
                        IdProducto = item.IdProducto,
                        IdSucursal = Orden.IdSucursal,
                        Producto = item.Producto
                    };

                    db.ProductosSucursal.Add(Prod);
                    //Generamos el movimiento

                    var Movimiento = new MovimientoAlmacen
                    {
                        Count = item.cantidad,
                        DescripcionMovimiento = "Alta por Orden de compra número " + Orden.ID,
                        FechaMovimiento = DateTime.Now,
                        IdOrednCompra = Orden.ID,
                        IdProducto = item.IdProducto,
                        IdSucursal = Orden.IdSucursal,
                        IdVenta = 0,
                        OrdenDeCompra = Orden,
                        Producto = item.Producto,
                        TipoMovimiento = "Ingreso",
                        username = HttpContext.User.Identity.Name
                    };

                    db.MovimientosAlmacen.Add(Movimiento);
                    db.SaveChanges();
                }
            }

            return RedirectToAction("Index");
        }
        public ActionResult InventarioSatelite()
        {
            string line;
            Sucursal suc = db.Sucursales.Single(s => s.Nombre.ToLower().Equals("satelite"));

            // Read the file and display it line by line.
            System.IO.StreamReader file =
               new System.IO.StreamReader(@"c:\INVENTARIO_SATELITE.CSV");
            while ((line = file.ReadLine()) != null)
            {
                if (line.Equals("") || line == null)
                    continue;
                //Parseamos la cadena
                string[] words = line.Split(',');
                string Clave = words[0];
                string Nombre = words[1];
                decimal existencia = decimal.Parse(words[2]);
                List<Producto> prods = db.Productos.Where(p => p.Clave.Trim().Equals(Clave.Trim()) || p.Nombre.Trim().Equals(Nombre.Trim())).ToList();
                if (prods.Count == 0 || prods == null)
                    continue;

                Producto prod = prods.First();

                var producto = new ProductoSucursal
                {
                    cantidad = existencia,
                    IdProducto = prod.ID,
                    IdSucursal = suc.ID,
                    Producto = prod,
                    Sucursal = suc
                };

                db.ProductosSucursal.Add(producto);
                db.SaveChanges();

            }

            file.Close();

            // Suspend the screen.
            return RedirectToAction("Google.com");
        }
        public ActionResult Create(OrdenTraslado orden)
        {
            int IdSucursalOrigen = int.Parse(Request.Form["IdSucursalOrigen"]);
            int IdSucursalDestino = int.Parse(Request.Form["IdSucursalDestino"]);
            int noProductos = int.Parse(Request.Form["noProductos"]);

            if (IdSucursalOrigen == 0 || IdSucursalDestino == 0)
            {
                return RedirectToAction("Error", new { Error = "Debes indicar las sucursales involucradas en el traslado" });
            }

            orden.IdSucursalDestino = IdSucursalDestino;
            orden.IdSucursalOrigen = IdSucursalOrigen;
            orden.FechaGenerada = DateTime.Now;
            orden.Activa = true;

            if (ModelState.IsValid)
            {
                //Guardamos la orden
                db.Traslados.Add(orden);
                db.SaveChanges();
                int IdOrden = orden.ID;

                orden = db.Traslados.Find(IdOrden);
                int i = 0;

                /*
                 * Guardamos cada uno de los productos
                 */
                orden.Productos = new List<ProductoTraslado>();
                for (i = 1; i <= noProductos; i++)
                {
                    string labelId = "IdProducto" + i;
                    string labelCantidad = "CantidadProducto" + i;
                    int idProd = int.Parse(Request.Form[labelId]);
                    decimal cantidad = decimal.Parse(Request.Form[labelCantidad]);

                    /*Checamos que haya en existencia para la sucursal origen el producto a trasladar*/
                    try
                    {
                        var ProdSuc = db.ProductosSucursal.Single(p => p.IdProducto == idProd && p.IdSucursal == IdSucursalOrigen);

                        if (ProdSuc.cantidad < cantidad)
                        {
                            db.Traslados.Remove(orden);
                            return RedirectToAction("Error", new { Error = "No existe la suficiente cantidad de productos para ser trasladada" });
                        }
                    }
                    catch
                    {
                        db.Traslados.Remove(orden);
                        return RedirectToAction("Error", new { Error = "No hay existencia de el producto " + idProd + " - No se guardará el traslado" });
                    }
                    /**/

                    var PO = new ProductoTraslado
                    {
                        cantidad = cantidad,
                        IdProducto = idProd,
                        Producto = db.Productos.Find(idProd),
                        IdTraslado = IdOrden

                    };

                    orden.Productos.Add(PO);
                    db.ProductosTraslado.Add(PO);
                    db.SaveChanges();

                }

                return RedirectToAction("Index");
            }

            return View(orden);
        }

        public ActionResult Details(int id)
        {
            var orden = db.Traslados.Find(id);
            ViewBag.SucursalOrigen = db.Sucursales.Find(orden.IdSucursalOrigen);
            Sucursal s = db.Sucursales.Find(orden.IdSucursalDestino);
            ViewBag.SucursalDestino = s ;

            ViewBag.Permiso = permisoSucursal(s.ID);

            return View(orden);
        }

        [HttpPost]
        public ActionResult Details(int id, int x = 1)
        {
            var orden = db.Traslados.Find(id);

            if (permisoSucursal(orden.IdSucursalDestino) == 0)
            {
                return RedirectToAction("Error", new { Error = "No puede aceptar el traslado ya que no cuenta con los permisos necesarios" });
            }

            //Actualizamos la orden de traslado de acuerdo a la información dada
            foreach (var item in orden.Productos)
            {
                string label = "cantidad" + item.IdProducto;
                try
                {
                    decimal cantidad = decimal.Parse(Request.Form[label]);
                    item.cantidad = cantidad;
                }
                catch
                {
                    ViewBag.SucursalOrigen = db.Sucursales.Find(orden.IdSucursalOrigen);
                    ViewBag.SucursalOrigen = db.Sucursales.Find(orden.IdSucursalDestino);
                    ViewBag.Proveedor = db.Proveedores.Find(orden.IdProveedor);
                    return View(orden);
                }
            }

            /*Registramos como procesada la orden*/
            orden.Activa = false;
            orden.usuario = HttpContext.User.Identity.Name;
            OrdenTraslado Orden = orden;

            db.SaveChanges();

            //Ahora damos de alta los productos en el inventario de sucursal destino y de baja en la sucursal origen

            foreach (var item in Orden.Productos)
            {
                /*Verificamos la existencia en el origen*/

                try
                {
                    //Averiguamos la existencia en la sucursal de origen
                    var existencia = db.ProductosSucursal.Single(p => p.IdProducto == item.IdProducto && p.IdSucursal == Orden.IdSucursalOrigen);

                    if (existencia.cantidad < item.cantidad)
                    {
                        orden.Activa = true;
                        db.SaveChanges();
                        return RedirectToAction("Error", new { Error = "No existe la suficiente cantidad de productos para ser trasladada" });
                    }
                }
                catch
                {
                    orden.Activa = true;
                    db.SaveChanges();
                    return RedirectToAction("Error", new { Error = "No existe la suficiente cantidad de productos para ser trasladada" });
                }

                /****************************************/

                try
                {
                    //Esta parte de ty se ejecutara si solo hay que actualizar cantidad
                    var ProdD = db.ProductosSucursal.Single(p => p.IdProducto == item.IdProducto && p.IdSucursal == Orden.IdSucursalDestino);
                    ProdD.cantidad += item.cantidad;

                    //Generamos el movimiento

                    var Movimiento = new MovimientoAlmacen
                    {
                        Count = item.cantidad,
                        DescripcionMovimiento = "Alta por Traslado desde sucursal " + Orden.IdSucursalOrigen,
                        FechaMovimiento = DateTime.Now,
                        IdOrednCompra = 0,
                        IdProducto = item.IdProducto,
                        IdSucursal = Orden.IdSucursalDestino,
                        IdVenta = 0,
                        Producto = item.Producto,
                        TipoMovimiento = "Ingreso"
                    };

                    db.MovimientosAlmacen.Add(Movimiento);

                    var ProdO = db.ProductosSucursal.Single(p => p.IdProducto == item.IdProducto && p.IdSucursal == Orden.IdSucursalOrigen);
                    ProdO.cantidad -= item.cantidad;

                    //Generamos el movimiento

                    Movimiento = new MovimientoAlmacen
                    {
                        Count = item.cantidad,
                        DescripcionMovimiento = "Baja por Traslado hacia sucursal " + Orden.IdSucursalDestino,
                        FechaMovimiento = DateTime.Now,
                        IdOrednCompra = 0,
                        IdProducto = item.IdProducto,
                        IdSucursal = Orden.IdSucursalOrigen,
                        IdVenta = 0,
                        Producto = item.Producto,
                        TipoMovimiento = "Salida"
                    };

                    db.SaveChanges();

                }
                catch
                {
                    //Creamos un nuevo producto Sucursal, para darlo de alta en el inventario de la sucursal
                    var ProdD = new ProductoSucursal
                    {
                        cantidad = item.cantidad,
                        IdProducto = item.IdProducto,
                        IdSucursal = Orden.IdSucursalDestino,
                        Producto = db.Productos.Find(item.IdProducto),
                        Sucursal = db.Sucursales.Find(Orden.IdSucursalDestino)
                    };

                    db.ProductosSucursal.Add(ProdD);

                    //Generamos el movimiento

                    var Movimiento = new MovimientoAlmacen
                    {
                        Count = item.cantidad,
                        DescripcionMovimiento = "Alta por Traslado desde sucursal " + Orden.IdSucursalOrigen,
                        FechaMovimiento = DateTime.Now,
                        IdOrednCompra = 0,
                        IdProducto = item.IdProducto,
                        IdSucursal = Orden.IdSucursalDestino,
                        IdVenta = 0,
                        Producto = item.Producto,
                        TipoMovimiento = "Ingreso"
                    };

                    db.MovimientosAlmacen.Add(Movimiento);

                    //Damos de baja en el Origen
                    var ProdO = db.ProductosSucursal.Single(p => p.IdProducto == item.IdProducto && p.IdSucursal == Orden.IdSucursalOrigen);
                    ProdO.cantidad -= item.cantidad;

                    //Generamos el movimiento

                    Movimiento = new MovimientoAlmacen
                    {
                        Count = item.cantidad,
                        DescripcionMovimiento = "Baja por Traslado hacia sucursal " + Orden.IdSucursalDestino,
                        FechaMovimiento = DateTime.Now,
                        IdOrednCompra = 0,
                        IdProducto = item.IdProducto,
                        IdSucursal = Orden.IdSucursalOrigen,
                        IdVenta = 0,
                        Producto = item.Producto,
                        TipoMovimiento = "Salida"
                    };
                    db.MovimientosAlmacen.Add(Movimiento);

                    db.SaveChanges();
                }
            }

            return RedirectToAction("Index");
        }