public async Task <IActionResult> SeleccionarEntradas(PagoViewModel vm, long eventoId)
        {
            try
            {
                ViewBag.DatosInvalidos      = false;
                ViewBag.EntradaInsuficiente = false;
                ViewBag.ClienteExistente    = false;
                ViewBag.EventoId            = eventoId;

                if (!ModelState.IsValid)
                {
                    ViewBag.DatosInvalidos = true;
                    throw new Exception("Error de validacion no controlado.");
                }

                var evento = await _helperEvento.Obtener(eventoId);

                if (evento.CupoDisponible < vm.Cantidad)
                {
                    ViewBag.EntradaInsuficiente = true;
                    throw new Exception("Cantidad de entradas insuficiente.");
                }

                long clienteId = vm.Cliente.Id;
                var  clienteVm = vm.Cliente;

                if (!User.Identity.IsAuthenticated)
                {
                    var existe = await _helperCliente.ExisteCliente(vm.Cliente.Dni, vm.Cliente.Email);

                    if (existe)
                    {
                        ViewBag.ClienteExistente = true;
                        throw new Exception("Ya existe un cliente con los datos especificados.");
                    }

                    var clienteDto = new ClienteDto()
                    {
                        Apellido = vm.Cliente.Apellido,
                        Nombre   = vm.Cliente.Nombre,
                        Dni      = vm.Cliente.Dni,
                        Email    = vm.Cliente.Email
                    };
                    clienteId = await _clienteServicio.InsertarDevuelveId(clienteDto);

                    clienteVm = await _helperCliente.Obtener(clienteId);
                }

                await _helperEvento.ActualizarCupoDisponible(evento.Id, vm.Cantidad);


                // guardo la forma de pago
                var formaPagoDto = new FormaPagoTarjetaDto()
                {
                    Nombre               = vm.FormaPago.Nombre,
                    NumeroTarjeta        = vm.FormaPago.NumeroTarjeta,
                    AnioExp              = vm.FormaPago.AnioExp,
                    MesExp               = vm.FormaPago.MesExp,
                    CodigoSeguridad      = vm.FormaPago.CodigoSeguridad,
                    CodigoPostal         = vm.FormaPago.CodigoPostal,
                    DireccionFacturacion = vm.FormaPago.DireccionFacturacion
                };
                var formaPagoId = await _formaPagoTarjetaServicio.InsertarDevuelveId(formaPagoDto);

                var formaPagoVm = await _helperFormaPagoTarjeta.Obtener(formaPagoId);

                // guardo las entradas para el cliente (for int i=0; 1 < cantidad; i++)
                var entradaVm = await _helperEntrada.ObtenerEntrada(vm.EntradaId);

                long[] entradas = new long[vm.Cantidad];
                for (int i = 0; i < vm.Cantidad; i++)
                {
                    var entrada = new EntradaDto()
                    {
                        ClienteId     = clienteId,
                        EventoId      = entradaVm.EventoId,
                        Precio        = entradaVm.Precio,
                        TipoEntradaId = entradaVm.TipoEntradaId
                    };
                    var entradaId = await _entradaServicio.InsertarDevuelveId(entrada);

                    entradas[i] = entradaId;
                }

                return(RedirectToAction("AltaFacturaRedirect", "FacturaPDF", new { clienteId = clienteVm.Id, formaPagoId = formaPagoVm.Id, entradaId = entradaVm.Id, cantidad = vm.Cantidad, entradas }));
            }
            catch (Exception)
            {
                vm.EntradasGenericas = await _helperEntrada.PoblarComboGeneric(eventoId);

                return(View(vm));
            }
        }