public BankTransactionState DeleteBankAccount(string password, bool force)
        {
            if (!SessionAccount.IsPasswordValid(password))
            {
                return(BankTransactionState.InvalidPassword);
            }

            if (SessionAccount == null)
            {
                return(BankTransactionState.NotLoggedIn);
            }

            if (SessionAccount.Credit.Amount > 0 && !force)
            {
                return(BankTransactionState.MoneyRemaining);
            }

            if (SessionAccount.Credit.Amount < 0)
            {
                return(BankTransactionState.DebtsNotCleared);
            }



            BankStorage.DeleteAccount(SessionAccount.Iban);

            SessionAccount = null;

            return(BankTransactionState.Success);
        }
        public bool Login(IBAN iban, string password)
        {
            var account = BankStorage.GetAccount(iban);

            if (account.IsPasswordValid(password))
            {
                SessionAccount = account;
                return(true);
            }

            return(false);
        }
        /// <summary>
        /// Prompts for an valid existing IBAN number.
        /// </summary>
        /// <returns>IBAN. If it has no value, operation should be quit</returns>
        private static IBAN?PromptForIban()
        {
            bool ibanCanLogin = false;
            IBAN?iban         = null;

            while (!ibanCanLogin)
            {
                Console.WriteLine("IBAN:[q to exit] ");

                var ibanInput = Console.ReadLine();
                ibanInput = Regex.Replace(ibanInput, @"\s+", ""); // Remove Whitespaces

                if (ibanInput == "q")
                {
                    return(null);
                }

                if (ibanInput.Length != 22)
                {
                    Console.WriteLine("IBAN must be 22 characters long!\n");
                    continue;
                }

                try
                {
                    iban = new IBAN(ibanInput);
                }
                catch (ArgumentException)
                {
                    Console.WriteLine("IBAN is invalid!\n");
                }

                if (!iban.HasValue)
                {
                    continue;
                }

                if (BankStorage.DoesAccountExist(iban.Value))
                {
                    ibanCanLogin = true;
                }
                else
                {
                    Console.WriteLine("Account does not exist or is not registered!\n");
                }
            }

            return(iban);
        }
 public void Transfer(Transaction transaction)
 {
     if (transaction.ReceiverIban.Equals(Iban))
     {
         Credit += transaction.Amount;
         BankStorage.AddTransaction(transaction);
     }
     else if (transaction.SenderIban.Equals(Iban))
     {
         Credit -= transaction.Amount;
         BankStorage.AddTransaction(transaction);
     }
     else
     {
         throw new InvalidOperationException("The transaction is not be associated with this account!");
     }
 }
        /// <summary>
        /// Displays the money transfer dialog.
        /// </summary>
        private static void TransferMoneyDialog()
        {
            Console.Clear();
            WriteHeader();
            Console.WriteLine("Transfer money to another account\n");

            double amountValue;

            do
            {
                Console.WriteLine("Enter the amount in euros you want to transfer: ");
            } while (!double.TryParse(Console.ReadLine(), out amountValue) || amountValue <= 0);

            var amount = new Money(amountValue, CurrencyCode.EUR);

            Console.WriteLine("\nEnter the IBAN of the account you want to transfer the money to:");
            var iban = PromptForIban();

            if (!iban.HasValue)
            {
                return;
            }

            Console.WriteLine("\nEnter a payment reference: ");
            var reference = Console.ReadLine();

            Console.Clear();

            Console.WriteLine($"Receiver: {BankStorage.GetAccount(iban.Value).AccountHolder} <{iban.Value}>");
            Console.WriteLine($"Amount: {amount}");
            Console.WriteLine($"Reference: {reference}");

            Console.WriteLine("\nDo you really want to start the transaction? [y/n]");
            var confirmation = Console.ReadLine();

            if (confirmation != "y")
            {
                return;
            }

            Console.WriteLine(currentClerk.TransferMoney(amount, iban.Value, reference) == BankTransactionState.Success
                ? "Success! Press any key to continue..."
                : "Something went wrong! Please try again later. Press any key to continue...");

            Console.ReadKey();
        }
        public BankTransactionState PutMoney(Money amount)
        {
            if (SessionAccount == null)
            {
                return(BankTransactionState.NotLoggedIn);
            }

            var transaction = new CashTransaction(amount, SessionAccount.Iban, "bar deposit");

            var receiver = BankStorage.GetAccount(SessionAccount.Iban);

            receiver.Transfer(transaction);

            BankStorage.AddAccount(receiver);

            SaveSession();

            return(BankTransactionState.Success);
        }
        public BankTransactionState TransferMoney(Money amount, IBAN to, string referenceText)
        {
            if (SessionAccount == null)
            {
                return(BankTransactionState.NotLoggedIn);
            }

            var transaction = new Transaction(amount, SessionAccount.Iban, to, referenceText);

            var receiver = BankStorage.GetAccount(to);

            SessionAccount.Transfer(transaction);
            receiver.Transfer(transaction);

            BankStorage.AddTransaction(transaction);
            BankStorage.AddAccount(receiver);

            SaveSession();

            return(BankTransactionState.Success);
        }
        public IBAN CreateBankAccount(Person accountHolder, string accountName, string password, Money?startingCredit)
        {
            var bankAccount = new BankAccount(accountHolder, accountName, password);

            if (DateTime.Now - accountHolder.BirthDate < new TimeSpan(days: 16 * 365, hours: 0, minutes: 0, seconds: 0))
            {
                // Student Bonus of 50€ if AccountHolder younger than 16
                var transaction = new CashTransaction(new Money(50, CurrencyCode.EUR), bankAccount.Iban, "Youth Bonus");
                bankAccount.Transfer(transaction);
            }

            if (startingCredit.HasValue)
            {
                var transaction = new CashTransaction(startingCredit.Value, bankAccount.Iban, "Starting credit");
                bankAccount.Transfer(transaction);
            }

            SessionAccount = bankAccount;

            BankStorage.AddAccount(bankAccount);

            return(bankAccount.Iban);
        }
 private void SaveSession() => BankStorage.AddAccount(SessionAccount);