예제 #1
0
 public static CarritoDeCompras GetCarrito(HttpContextBase context)
 {
     var carrito = new CarritoDeCompras();
     carrito.IdCarritoDeCompras = context.User.Identity.Name;
     return carrito;
 }
        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;
        }