Example #1
0
 public WithdrawArgs(DateTime time, decimal requestedSum, AtmState resultOfOperation, Money money)
 {
     Time              = time;
     RequestedSum      = requestedSum;
     ResultOfOperation = resultOfOperation;
     Money             = money;
 }
Example #2
0
        public string ToString(Money money, AtmState state)
        {
            if (money == null)
            {
                throw new ArgumentNullException("money");
            }
            var stringBuilder = new StringBuilder();

            try
            {
                if (state != AtmState.NoError)
                {
                    return(_errromMessage[state]);
                }
                foreach (var variable in money.Banknotes.Where(variable => variable.Value != 0))
                {
                    stringBuilder.Append("[");
                    stringBuilder.Append(variable.Key);
                    stringBuilder.Append(',');
                    stringBuilder.Append(variable.Value);
                    stringBuilder.Append("]");
                }
            }
            catch (KeyNotFoundException ex)
            {
                Log.Error(ex);
                throw;
            }
            catch (ArgumentNullException ex)
            {
                Log.Error(ex);
                throw;
            }
            return(stringBuilder.ToString());
        }
Example #3
0
 public Record(DateTime timeOfOperation, decimal requestedSum, Money money, AtmState resultOfOperation)
 {
     Money             = money;
     TimeOfOperation   = timeOfOperation;
     ResultOfOperation = resultOfOperation;
     RequestedSum      = requestedSum;
 }
Example #4
0
        private static void CheckRegisterCMD(string[] args)
        {
            if (IsEmail(args[1]) && args[2].Length >= 5)
            {
                if (UserManager.EmailExists(args[1]) == false)
                {
                    if (UserManager.RegisterUser(args[1], args[2]) == true)
                    {
                        Console.WriteLine("Please log in to continue!");
                        s_currentState = AtmState.MainScreen;
                    }
                    else
                    {
                        Console.WriteLine("Email in use");
                    }
                }
                else
                {
                    Console.WriteLine("Email in use");
                }
            }

            else
            {
                Console.WriteLine("ERROR: Either that was an invalid email or your password was less than 5 characters.");
            }
        }
Example #5
0
 /// <summary>
 /// Sends user to the portal, printing available commands to the console
 /// </summary>
 private static void SendToPortal()
 {
     Console.WriteLine(" ");
     Console.WriteLine(" ");
     Console.WriteLine("Logged in. Welcome to the user portal. Available commands are ");
     Console.WriteLine("accounts - used to view current bank accounts opened with us.");
     Console.WriteLine("createaccount type - used to create a new bank account. Valid types are checking, savings, business");
     Console.WriteLine("You can quit at anytime by typing 'quit' or logout by typing 'logout'");
     s_currentState = AtmState.UserPortal;
 }
Example #6
0
        internal static void OnWithdrawMoneyEvent(decimal requestedSum, AtmState resultOfOperation, Money money)
        {
            var handler      = WithdrawMoneyEvent;
            var withdrawArgs = new WithdrawArgs(DateTime.Now, requestedSum, resultOfOperation, (Money)money.Clone());

            if (handler != null)
            {
                handler(null, withdrawArgs);
            }
        }
Example #7
0
 private static void VerifyPinExists()
 {
     if (s_currentUser.AtmPin != ushort.MaxValue)
     {
         SendToPortal();
     }
     else
     {
         Console.WriteLine("You have not selected a pin yet. Please type a four digit numeric code below");
         s_currentState = AtmState.SelectPin;
     }
 }
Example #8
0
        public string ToString(Money money, AtmState state)
        {
            var stringBuilder = new StringBuilder();

            try
            {
                stringBuilder.Append(Enum.GetName(typeof(AtmState), state) + ' ');
                foreach (var variable in money.Banknotes)
                {
                    stringBuilder.Append('[');
                    stringBuilder.Append(variable.Key);
                    stringBuilder.Append('-');
                    stringBuilder.Append(variable.Value);
                    stringBuilder.Append(']');
                    stringBuilder.Append('\n');
                }
            }
            catch (ArgumentNullException ex)
            {
                Log.Error(ex);
                throw;
            }
            return(stringBuilder.ToString());
        }
Example #9
0
        Dictionary <Banknote, int> IDecomposable.DecomposeMoney(Dictionary <Banknote, int> money, decimal requestedSum,
                                                                out AtmState state)
        {
            if (TotalMoney(money) < requestedSum)
            {
                state = AtmState.NotEnoughMoney;
                return(new Dictionary <Banknote, int>());
            }

            if (TotalMoney(money) < requestedSum)
            {
                state = AtmState.NotEnoughMoney;
                return(null);
            }

            bool isSumsLess = false;

            List <List <decimal> > oldDegree = new List <List <decimal> >();

            List <decimal> firstSum = new List <decimal> {
                0
            };

            firstSum.AddRange(money.Select(i => 0).Select(dummy => (decimal)dummy));

            oldDegree.Add(firstSum);

            do
            {
                List <List <decimal> > newDegree = new List <List <decimal> >();

                for (int i = 0; i < oldDegree.Count(); i++)
                {
                    isSumsLess = false;

                    for (int j = 0; j < money.Count(); j++)
                    {
                        if (oldDegree[i][0] + money.ElementAt(j).Key.Nominal <= requestedSum &&
                            oldDegree[i][j + 1] + 1 <= money.ElementAt(j).Value)
                        {
                            List <decimal> newSum = new List <decimal>(oldDegree[i]);
                            newSum[0] += money.ElementAt(j).Key.Nominal;
                            newSum[j + 1]++;

                            newDegree.Add(newSum);
                            isSumsLess = true;

                            if (newDegree[newDegree.Count() - 1][0] != requestedSum)
                            {
                                continue;
                            }
                            state = AtmState.Ok;
                            Dictionary <Banknote, int> decomposedSum = new Dictionary <Banknote, int>();
                            for (int h = 1; h < newDegree[i].Count(); h++)
                            {
                                decomposedSum.Add(money.ElementAt(h - 1).Key,
                                                  (int)newDegree[newDegree.Count() - 1][h]);
                            }
                            Money decomposedMoney = new Money {
                                Banknotes = decomposedSum
                            };
                            return(decomposedMoney.Banknotes);
                        }
                    }
                }
                oldDegree = newDegree;
            } while (isSumsLess);

            state = AtmState.ImpossibleToCollectMoney;

            return(null);
        }
        public bool TrySelect(List <MutablePair <decimal, int> > moneyCassettes, decimal requestedSum, out AtmState result,
                              out List <MutablePair <decimal, int> > selectedMoney)
        {
            try
            {
                if (moneyCassettes == null)
                {
                    throw new ArgumentNullException("moneyCassettes");
                }
                if (requestedSum < 0)
                {
                    throw new FormatException("requestedSum");
                }
                if (TotalSum(moneyCassettes) < requestedSum)
                {
                    result        = AtmState.MoneyDeficiency;
                    selectedMoney = null;
                    return(false);
                }
                selectedMoney = new List <MutablePair <decimal, int> >();

                var cassetteUsed     = new Stack <MutablePair <decimal, int> >();
                var cassetteForUsing = new LinkedList <MutablePair <decimal, int> >();
                var moneyStack       = new Stack <MutablePair <decimal, int> >();
                foreach (var item in moneyCassettes)
                {
                    cassetteForUsing.AddFirst(item);
                }
                //пока для выдачи не останется ноль повторяем
                while (requestedSum > 0)
                {
                    //смотрим номинал купюр находящийся в вершине стека номиналов которые буду использованы
                    var currentCassette = cassetteForUsing.Last();

                    //если кроме текущего номинала доступен хотя бы ещё один
                    //или с помощьью текущего номинала можно выдать оставшуюся сумму
                    if ((cassetteForUsing.Count() > 1) || (
                            ((requestedSum % currentCassette.Key == 0) && (
                                 requestedSum / currentCassette.Key <= currentCassette.Value))))

                    {
                        //извекаем текущий номинал из стека неиспользованных номиналов
                        cassetteForUsing.RemoveLast();
                        //находим наименьшее между количеством купюр в банкомате и максиммальным количеством купюр
                        //суммарное достоинство которых не превышает требуемой суммы
                        var banknotesNumber = Math.Min((int)(requestedSum / currentCassette.Key),
                                                       currentCassette.Value);
                        //извлекаем купюры из кассеты
                        currentCassette.Value -= banknotesNumber;
                        //из запрошенной суммы вычитаем сумму выбранных на данном шаге купюр
                        requestedSum -= currentCassette.Key * banknotesNumber;
                        //в стек использованных номиналов добавляем текущий номинал
                        cassetteUsed.Push(currentCassette);
                        //в деньги для выдачи добавляем купюры, выбранные на текущем шаге
                        moneyStack.Push(new MutablePair <decimal, int>(currentCassette.Key, banknotesNumber));
                        continue;
                    }

                    //если цикл не пошёл на следующий шаг
                    //то пока есть использованные номиналы и количество
                    //купюр текущего номминала равно нулю
                    while (cassetteUsed.Any() && moneyStack.Peek().Value == 0)
                    {
                        //переносим использованные номиналы в стек неиспользованных
                        cassetteForUsing.AddLast(cassetteUsed.Pop());
                        //извлекаем из выдачи номиналы с нулевым количеством
                        moneyStack.Pop();
                    }

                    //если после извлечения купюр на предыдущем этапе
                    //в выдаче не осталось никаких номиналов
                    if (!moneyStack.Any())
                    {
                        // то получить нужную сумму невозможно
                        result = AtmState.CombinationFailed;
                        return(false);
                    }

                    //если номиналы остались, то уменьшаем на единицу количество купюр
                    //номинала из вершины стека
                    moneyStack.Peek().Value--;
                    //возвращаем эту купюру в контейнер
                    cassetteUsed.Peek().Value++;
                    //увеличиваем сумму для подбора на номинал купюры, перемещённой обратно в банкомат
                    requestedSum += cassetteUsed.Peek().Key;
                }

                //если произошёл успешный выход из цикла, состоянию присваиваем статус успешного завершения
                result = AtmState.NoError;
                //деньги из стека перекладываем в объект класса Money и возвращаем результат
                selectedMoney.AddRange(moneyStack.ToArray());
            }
            catch (ArgumentNullException ex)
            {
                Log.Error(ex);
                result        = AtmState.MoneyDeficiency;
                selectedMoney = null;
                return(false);
            }
            catch (FormatException ex)
            {
                Log.Error(ex);
                result        = AtmState.FormatError;
                selectedMoney = null;
                return(false);
            }
            return(true);
        }
Example #11
0
 public Atm()
 {
     currentState = new NoCash(this);
 }