public ActionResult Procesar(UsuarioInfoCompraViewModel compraVM)
        {
            UnidadDeTrabajo <productos>             unidad_productos             = new UnidadDeTrabajo <productos>(new BDContext());
            UnidadDeTrabajo <facturaciones>         unidad_facturaciones         = new UnidadDeTrabajo <facturaciones>(new BDContext());
            UnidadDeTrabajo <usuario_facturaciones> unidad_usuario_facturaciones = new UnidadDeTrabajo <usuario_facturaciones>(new BDContext());
            UnidadDeTrabajo <facturacion_producto>  unidad_facturacion_producto  = new UnidadDeTrabajo <facturacion_producto>(new BDContext());
            BDContext context = new BDContext();

            try
            {
                // obtener el id del usuario que esta logueado
                var userID = User.Identity.GetUserId();

                // obtener el usuario con ese id de base de datos
                var usuario_BD = context.usuarios.Where(u => u.Usuario_ID.Equals(userID)).Single();

                // obtener todos los productos en su carrito
                List <sp_obtenerProductosUsuarioCarrito_Result> lista_productos_cliente = context.sp_obtenerProductosUsuarioCarrito(usuario_BD.userId).ToList();
                productos producto_BD;

                // calcular total y subtotal
                double total = 0, subtotal = 0, impuesto = 0.13;
                foreach (var producto in lista_productos_cliente)
                {
                    producto_BD = unidad_productos.genericDAL.Get(producto.productoId);
                    subtotal   += (double)(producto.cantidad_producto * producto_BD.precio);
                }
                impuesto = impuesto * subtotal;
                total    = subtotal + impuesto;

                // obtener el siguiente id de facturaciones
                sp_obtenerUltimoIdFactura_Result2 id_factura = context.sp_obtenerUltimoIdFactura().FirstOrDefault();

                // crear una nueva factura
                facturaciones factura = new facturaciones
                {
                    nombre    = compraVM.nombre_tarjeta,
                    fecha     = DateTime.UtcNow,
                    impuesto  = 13,
                    subtotal  = subtotal,
                    total     = total,
                    id_estado = 2
                };

                // agregar factura

                unidad_facturaciones.genericDAL.Add(factura);
                unidad_facturaciones.Complete();

                // asignar factura a usuario

                usuario_facturaciones factura_usuario = new usuario_facturaciones
                {
                    usuarioId     = usuario_BD.userId,
                    facturacionId = (int)id_factura.Column1,
                    id_estado     = 2
                };
                unidad_usuario_facturaciones.genericDAL.Add(factura_usuario);
                unidad_usuario_facturaciones.Complete();

                // asignar productos a factura

                /*facturacion_producto facturacion_producto;
                 * List<facturacion_producto> lista_facturaciones_producto = new List<facturacion_producto>();*/

                IProductosFacturacionDAL productosFacturacionDAL = new ProductosFacturacionDALImpl();

                sp_obtenerFacturacionesProducto_Result facturacionProducto;
                foreach (var producto in lista_productos_cliente)
                {
                    /*facturacion_producto = new facturacion_producto
                     * {
                     *  productoId = producto.productoId,
                     *  cantidad = producto.cantidad_producto,
                     *  id_estado = 2,
                     *  facturacionId = (int)id_factura.Column1,
                     * };
                     * lista_facturaciones_producto.Add(facturacion_producto);*/

                    facturacionProducto = new sp_obtenerFacturacionesProducto_Result
                    {
                        productoId    = producto.productoId,
                        facturacionId = (int)id_factura.Column1,
                        cantidad      = producto.cantidad_producto,
                        id_estado     = 2
                    };

                    productosFacturacionDAL.agregarProductoFacturacion(facturacionProducto);
                }

                //generar factura PDF

                generarFactura((int)id_factura.Column1);


                /* unidad_facturacion_producto.genericDAL.AddRange(lista_facturaciones_producto);
                 * unidad_facturacion_producto.Complete();
                 */
                // limipar el carrito del usuario
                context.sp_eliminarCarritoCliente(usuario_BD.userId);

                return(new HttpStatusCodeResult(HttpStatusCode.OK));
            }
            catch (Exception)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.InternalServerError));
            }
        }