private static bool Deposito(Transacciones newTrans)
        {
            int     n_AccountDest; //Variable utilizada para guardar el número de cuenta a la que se depositará
            decimal n_Monto;       //Variable que almacena el monto a depositar.

Deposito:
            Console.WriteLine("Ingresa el numero de cuenta a la que deseas depositar");
            n_AccountDest = Convert.ToInt32(Console.ReadLine()); //Se guarda el número de cuenta destino.

            using (var db = new ATMdb())
            {
                try
                { Usuarios us = db.Usuarios.Single(st => st.noCuenta == n_AccountDest); }//Se hace un select en la tabla Usuarios con e
                catch (Exception)
                {
                    Console.Clear();
                    Console.WriteLine("Cuenta no Encontrada!");
                    goto Deposito;
                }
            }

            using (var db = new ATMdb())
            {
Monto:
                Console.WriteLine("Introduce la cantidad a depositar, para cancelar introduzca 0");
                n_Monto = Convert.ToInt32(Console.ReadLine()); //n_Monto guarda el monto a depositar.
                if (n_Monto == 0)                              ///Si n_Monto es 0... (Cancelar Operacion)
                {
                    Console.Clear();
                    return(false);
                }
                n_Monto /= 100;                                    //Se divide n_Monto entre 100 para contemplar los centavos.

                if (!DepositWaitTime(n_Monto))                     //Verifica que el usuario introduzca el dinero en en plazo de 2min.
                {
                    goto Deposito;                                 //Si excedió el tiempo se vuelve a iniciar el proceso de depósito.
                }
                db.Transacciones.Add(newTrans);                    //Inserta el registro de la tabla transaccion.
                int affected = db.SaveChanges();                   //Guarda los cambios en la bd.
                int maxFolio = db.Transacciones.Max(p => p.Folio); //maxFolio adquiere el valor del folio que se acaba de insertar.

                var newDeposito = new Deposito
                {
                    Folio      = maxFolio,      //Deposito.Folio = maxFolio
                    cuentaDest = n_AccountDest, //Deposito.cuentaDest = n_AccountDest
                    monto      = n_Monto        //Deposito.monto = n_Monto
                };
                db.Deposito.Add(newDeposito);   //Se inserta el registro en la Tabla Deposito

                // ActualizarSaldo(db, n_Account, n_Monto, '-');//Disminuye el saldo de la cuenta de origen (- Monto)
                ActualizarSaldo(db, n_AccountDest, n_Monto, '+');//Aumenta el saldo de la cuenta destino (+ Monto)

                affected = db.SaveChanges();
                return(affected == 1);
            }
        }
        private static bool Retiro(int n_Account, Transacciones newTrans, ref int atmMoney)
        {
            Dictionary <int, int> retCants = new Dictionary <int, int>(); //Se crea un diccionario para relacionar el índice de cada retiro con su valor.

            retCants.Add(1, 20);                                          //1: $20
            retCants.Add(2, 40);                                          //2: $40
            retCants.Add(3, 60);                                          //3: $60
            retCants.Add(4, 100);                                         //4: $100
            retCants.Add(5, 200);                                         //5: $200
            Console.Clear();
aRetiro:
            Console.WriteLine("Elige el monto a retirar\n1:$20\n2:$40\n3:$60\n4:$100\n5:$200\n6:Cancelar Operación");
            int opt = Convert.ToInt32(Console.ReadLine());

            if (opt == 6)//Si opt es igual a 6(Cancelar Operacion)...
            {
                return(false);
            }

            decimal n_Monto = retCants[opt]; //n_Monto adquiere el valor del monto a retirar, a partir del diccionario.

            if (atmMoney < n_Monto)          //Si la cantidad de dinero del cajero es menor que el monto a retirar...
            {
                Console.Clear();
                Console.WriteLine("Lo sentimos, el cajero no cuenta con el dinero suficiente, escoge otro monto");
                return(false);
            }

            using (var db = new ATMdb())
            {
                if (!VerifyEnoughBalance(db, n_Account, n_Monto))//Se llama a VerifyEnoughBalance para verificar si el Usuario cuenta
                //con los fondos suficientes.
                {
                    Console.WriteLine("Fondos Insuficientes");
                    goto aRetiro;
                }
                ActualizarSaldo(db, n_Account, n_Monto, '-');      //Se llama a esta función para restarle al usuario el monto que retiró.

                db.Transacciones.Add(newTrans);                    //Se inserta el registro en Transacciones.
                int affected = db.SaveChanges();                   //Se guardan los cambios.
                int maxFolio = db.Transacciones.Max(p => p.Folio); //Se obtiene el Folio de la Transacción generada.

                var newRetiro = new Retiro                         //Se crea la variable newRetiro de tipo retiro.
                {
                    Folio = maxFolio,
                    monto = n_Monto
                };
                db.Retiro.Add(newRetiro);    //Se inserta el registro en Retiro.
                Console.WriteLine("Saldo Actualizado!");
                affected = db.SaveChanges(); //Se guardan los cambios.
                return(affected == 1);
            }
        }
        private static bool Transaccion(int type, int n_Account, ref int atmMoney)
        {
            using (var db = new ATMdb())
            {
                DateTime localDate = DateTime.Now; //Se crea la variable localdate con la fecha y hora actual.

                var newTrans = new Transacciones   //Se crea una nueva variable tipo Transacciones y se le introducen todos los datos
                                                   //de la transaccion.
                {
                    opeID    = type,               //tipo de transaccion, consulta, depósito o retiro.
                    cuentaOr = n_Account,          //cuenta de origen
                    dateTime = localDate           //fecha y hora de la transacción.
                };
                if (type == 2)                     //si la operación es Depósito..
                {
                    Deposito(newTrans);            //se llama a la función Deposito mandándole la nueva variable tipo Transacción.
                    return(true);
                }
                if (type == 3)                                 //si la operación es Retiro..
                {
                    Retiro(n_Account, newTrans, ref atmMoney); //se llama a la función Retiro mandándole la nueva variable tipo Transacción.
                    return(true);
                }
                else//si la operación es Consulta...
                {
                    Consulta(n_Account);//Se llama a la función Consulta mandándole el número de cuenta del usuario.
                    db.Transacciones.Add(newTrans);  //Se inserta el registro en Transacciones.
                    int affected = db.SaveChanges(); //Se guardan cambios.
                    return(affected == 1);
                }
            }
        }
 private static bool Consulta(int n_Account)
 {
     using (var db = new ATMdb())
     {
         //Se raliza un Queryable tipo Clientes que selecciona el registro de la cuenta especificada.
         IQueryable <Clientes> client = db.Clientes.Where(Clientes => Clientes.noCuenta == n_Account);
         foreach (var cl in client)
         {
             Console.WriteLine("Saldo Actual: $" + cl.Monto); //Se imprime el saldo de la cuenta.
         }
         int affected = db.SaveChanges();                     //Se guardan los cambios.
         return(affected == 1);
     }
 }
        private static void ActualizarSaldo(ATMdb db, int n_Account, decimal n_Monto, char op)
        {
            var result = db.Clientes.SingleOrDefault(b => b.noCuenta == n_Account);//La variable result selecciona el registro de la cuenta especificada.

            if (result != null)
            {
                if (op == '+')
                {
                    result.Monto = result.Monto + n_Monto;//Se suma el monto a la cuenta.
                }
                else
                {
                    result.Monto = result.Monto - n_Monto;//Se resta el monto a la cuenta
                }
                db.SaveChanges();
            }
        }
        private static bool HistorialForUsers(int n_Account, int n_Month, string month)
        {
            using (var db = new ATMdb())
            {
                //Se selecciona el Folio, la fecha, y el tipo de operaccion realizado para cada una de las transacciones.

                /*Select Transacciones.Folio, Transacciones.dateTime, Concepto.Operaciones FROM Transacciones
                 * INNER JOIN Operaciones WHERE Transacciones.opeID = Operaciones.opeID;
                 */
                var query = (from s in db.Transacciones
                             join sa in db.Operaciones on s.opeID equals sa.opeID
                             where s.dateTime.Month == n_Month && s.cuentaOr == n_Account
                             select new
                {
                    Folio = s.Folio,
                    dateTime = s.dateTime,
                    concepto = sa.concepto
                }).ToList();

                if (query.Count == 0)//Si no se encontró ninguna transacción...
                {
                    Console.WriteLine("No se encontro ningún movimiento\n");
                }

                foreach (var item in query)
                {
                    Console.WriteLine("Mes: " + month);
                    Console.Write(item.concepto + " ");
                    if (item.concepto == "Deposito  ")
                    {
                        Deposito dep = db.Deposito.SingleOrDefault(p => p.Folio == item.Folio); //Se selecciona el Depósito que cuenta con el Folio generado de Transacción
                        Console.Write("a N° de cuenta " + dep.cuentaDest);                      //Numero de cuenta destino
                        Console.Write(" | Monto: " + dep.monto);                                //Monto
                    }
                    if (item.concepto == "Retiro    ")
                    {
                        Retiro ret = db.Retiro.Single(p => p.Folio == item.Folio); // Se selecciona el Retiro que cuenta con el Folio generado de Transacción
                        Console.Write("Monto: " + ret.monto);                      //Monto
                    }
                    Console.WriteLine("\n" + item.dateTime + "\n");                //Fecha
                }
                int affected = db.SaveChanges();
                return(affected == 1);
            }
        }