예제 #1
0
        //public virtual Factura Factura { get; set; }
        //Relacion con la cuenta de crédito
        /*
         * Esta funcion cancela la venta, regresando los productos al inventario
         */
        public int CancelarVenta(int IdSucursal)
        {
            foreach(ProductoVenta item in ProductosVenta)
            {
                try{
                    /*
                     * Buscamos el elemento en ProductoVenta para eliminarlo
                     */
                    var PV = db.ProductosVenta.Single( p => p.VentaId == ID && p.ProductoId == item.ID);

                    //Lo eliminamos
                    db.ProductosVenta.Remove(PV);

                    /*
                     * Buscamos el ProductoSucursal de item para poder reestablecer su producto
                     */

                    var PS = db.ProductosSucursal.Single(ps => ps.IdProducto == item.ID && ps.IdSucursal == IdSucursal);

                    PS.cantidad += item.Count;

                    /*
                     * Aqui generamos un movimiento de regreso
                     */

                    MovimientoAlmacen movimiento = new MovimientoAlmacen
                    {
                        DescripcionMovimiento = "Regreso a inventario por cancelacion de la Venta " + ID + "Con folio y serie " + ClaveCFD,
                        Count = item.Count,
                        FechaMovimiento = System.DateTime.Now,
                        OrdenDeCompra = null,
                        IdOrednCompra = 0,
                        IdProducto = item.ProductoId,
                        Producto = db.Productos.Find(item.ProductoId),
                        IdSucursal = IdSucursal,
                        Sucursal = db.Sucursales.Find(IdSucursal),
                        TipoMovimiento = "Regreso a Inventario",
                        IdVenta = 0
                    };

                    db.MovimientosAlmacen.Add(movimiento);
                    db.SaveChanges();
                }
                catch
                {
                    return 0;
                }

            }

            //ahora eliminamos por completo nuesta venta
            try
            {
                var vent = db.Ventas.Find(ID);

                db.Ventas.Remove(vent);
                db.SaveChanges();
                return 1;
            }
            catch
            {
                return 0;
            }
        }
        public int CrearVenta(CarritoDeCompras carrito, Venta venta, int idCliente, int credito, int IdSucursal)
        {
            decimal IVA = 0.16M;
            /*
             * Proceso de la venta:
             * 1.- Setear los precios y cantidades finales de cada producto - Se hace en el controlador
             * 2.- Calcular el total de la venta, así como los impuestos y el Subtotal
             * 3.- Crear las relaciones de la venta con los productos
             * 4.- Mandar a crédito si asi se requiere
             * 5.- Mandar Datos a la FEL para la factura electrónica
             * 6.- Recibir la factura electrónica y guardarla
             */
            decimal totalVenta = 0;

            var cartItems = carrito.GetElementos();

            foreach (var item in cartItems)
            {
                var productoVenta = new ProductoVenta
                {
                    ProductoId = item.ProductoId,
                    VentaId = venta.ID,
                    PrecioVenta = item.PrecioVenta,
                    Count = item.Count,
                    Producto = db.Productos.Find(item.ProductoId),
                    Venta = db.Ventas.Find(venta.ID)

                };

                db.ProductosVenta.Add(productoVenta);
                db.SaveChanges();

                /*Aqui quitaremos los productos del inventario y generaremos un moviemiento en el*/

                //Buscamos el elemento que representa en ProductoSucursal

                var PS = db.ProductosSucursal.Single(p => p.IdProducto == item.ProductoId && p.IdSucursal == IdSucursal);

                //Quitamos del inventario la cantidad
                PS.cantidad -= item.Count;

                //Aqui generamos un movimiento de Almacen
                 MovimientoAlmacen movimiento = new MovimientoAlmacen
                {
                    DescripcionMovimiento = "Venta de " + item.Count + " del producto " + item.Producto.Nombre,
                    Count = item.Count,
                    FechaMovimiento = System.DateTime.Now,
                    OrdenDeCompra = null,
                    IdOrednCompra = 0,
                    IdProducto = item.ProductoId,
                    Producto = db.Productos.Find(item.ProductoId),
                    IdSucursal = IdSucursal,
                    Sucursal = db.Sucursales.Find(IdSucursal),
                    TipoMovimiento = "Venta",
                    IdVenta = venta.ID,
                    username = HttpContext.User.Identity.Name
                };

                 db.MovimientosAlmacen.Add(movimiento);

                //Establecer el Subtotal de la venta - Modificar para el cambio de precios
                totalVenta += (item.Count * productoVenta.PrecioVenta);
            }

            venta.Moneda = "MXN Moneda Nacional (Peso Mexicano)";

            venta.usuario = HttpContext.User.Identity.Name;

            venta.Subtotal = totalVenta;

            venta.TotalImpuestosRetenidos = 0;

            venta.TotalImpuestosTrasladados = totalVenta * IVA;

            venta.IdCliente = idCliente;

            venta.IdSucursal = IdSucursal;

            decimal total =  venta.Subtotal + venta.TotalImpuestosTrasladados;

            venta.Total = total;

            decimal centavos = (total - (int)total) * 100;

            venta.ImporteLetra = toText(venta.Total) + ", " + (int)centavos + "/100 MXN";

            venta.Liquidado = true;

            venta.FormaDePago = "Pago en una sola exhibición";

            venta.IdSucursal = IdSucursal;

            decimal totalN = (totalVenta) + (totalVenta * IVA);

            decimal centavosN = 100*(totalN - (int)total);

            int cn = (int)centavosN;
            venta.ImporteLetra = toText(totalN) + " " + cn + "/100 M.N.";

            venta.Total = total;

            //Generamos un movimiento de Almacen
            /*
             * Averiguamos la cuenta de crédito a la que se va a cargar esta venta
             */
            if (credito == 1)
            {
                var cCredito = db.CuentasCredito.Single(c => c.IdCliente == idCliente);

                venta.Liquidado = false;

                if (cCredito.Ventas.Count == 0)
                {
                    cCredito.Ventas = new List<Venta>();
                    cCredito.Ventas.Add(venta);
                }
                else
                    cCredito.Ventas.Add(venta);

            }

            db.SaveChanges();

            carrito.VaciarCarrito();

            return venta.ID;
        }
        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 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");
        }