public IHttpActionResult ChangePassword(ChangePassword cambioClave)
        {
            if (string.IsNullOrEmpty(cambioClave.Password)) throw new Exception("Ingrese la clave actual");

            if (cambioClave.Password == cambioClave.NewPassword) throw new Exception("La clave nueva no debe ser igual a la anterior");

            if (cambioClave.NewPassword != cambioClave.NewPasswordConfirm) throw new Exception("La clave nueva no coincide");

            var bytesPwd = Convert.FromBase64String(cambioClave.NewPassword);
            var Pwd = Encoding.UTF8.GetString(bytesPwd);

            if (Pwd.Length < 4) throw new Exception("la nueva clave es muy corta");

            using (var entities = new MoneyPoints_dlloEntities())
            {
                var user = entities.Usuarios.FirstOrDefault(u => u.UsuarioId == cambioClave.UsuarioId && u.Password == cambioClave.Password);

                if (user == null) throw new Exception("Clave actual incorrecta");

                user.Password = cambioClave.NewPassword;
                entities.Entry(user).State = System.Data.Entity.EntityState.Modified;
                entities.SaveChanges();
            }

            return Ok();
        }
        public void FinalizarCompra(Venta venta)
        {
            try
            {
                using (var en = new MoneyPoints_dlloEntities())
                {
                    var compra = new Compra
                    {
                        AfiliadoId = venta.AliadoId,
                        Fecha = DateTime.Now,
                        Valor = venta.Valor,
                        NumeroFactura = Guid.NewGuid().ToString().Split('-')[0], //Cambiar forma de generar numero de factura por un consecutivo,
                        Estado = "Finalizada" //Cambiar para enumeracion
                    };

                    compra.BeneficiariosClientesCompras.Add(new BeneficiariosClientesCompra
                    {
                        BeneficiariosClienteId = venta.BeneficiariosClienteId
                    });

                    compra.DetallesCompras.Add(new DetallesCompra { Valor = venta.Valor });

                    en.Compras.Add(compra);

                    var benefCliente = en.BeneficiariosClientes.Find(venta.BeneficiariosClienteId);

                    //Restamos el saldo
                    benefCliente.Saldo -= venta.Valor;

                    if (benefCliente.Saldo < 0) throw new Exception("Fondos insuficientes para esta compra");

                    //todo: falta restar los puntos, se debe validar contra la equivalencia
                    var equiv = en.Equivalencias.FirstOrDefault(e => e.ClienteId == benefCliente.ClienteId);

                    var rel = equiv.Puntos / equiv.Valor;

                    benefCliente.Puntos = Convert.ToInt32(Math.Round(benefCliente.Puntos * rel, 0));

                    en.Entry(benefCliente).State = EntityState.Modified;

                    en.SaveChanges();
                }

                Clients.Group(venta.ConnectionIdCliente).finalizarCompraCompleted("Compra realizada exitosamente.");
            }
            catch (Exception ex)
            {
                string details = "";
                if (ex.InnerException != null) details = ex.InnerException.Message;
                Clients.Group(venta.ConnectionIdCliente).finalizarCompraCompleted("No se pudo finalizar la compra: " + ex.Message + details);
            }
        }
        public IHttpActionResult ChangePIN(ChangePassword cambioClave)
        {
            if (cambioClave.PIN == cambioClave.NewPIN) throw new Exception("El nuevo PIN no debe ser igual al anterior");

            if (cambioClave.NewPIN != cambioClave.ConfirmPIN) throw new Exception("El nuevo PIN no coincide");

            try
            {
                var bytesPIN = System.Convert.FromBase64String(cambioClave.NewPIN);
                var PIN = Encoding.UTF8.GetString(bytesPIN);

                if (PIN.Length != 4) throw new Exception("El PIN debe ser de cuatro digitos");
            }
            catch (Exception)
            {
                throw new Exception("No se pudo decodificar la clave, debe estar en base 64");
            }

            using (var entities = new MoneyPoints_dlloEntities())
            {
                var user = entities.Usuarios.FirstOrDefault(u => u.UsuarioId == cambioClave.UsuarioId);

                if (user == null) throw new Exception("Usuario no existe");

                var benef = user.Tercero.Beneficiarios.ToList()[0];

                if (benef.Pin != cambioClave.PIN) throw new Exception("PIN incorrecto");

                benef.Pin = cambioClave.NewPIN;

                entities.Entry(benef).State = System.Data.Entity.EntityState.Modified;

                entities.SaveChanges();
            }

            return Ok();
        }