/// <summary>
        /// Cancel a transaction.
        /// </summary>
        /// <param name="cancelation">Cancelation info.</param>
        internal void Cancel(CancelationOption cancelation)
        {
            ICancellationReport cancelReport = this.StoneAuthorizer
                                               .Cancel(cancelation.StoneId, cancelation.Amount);

            if (cancelReport.WasSuccessful == true)
            {
                Console.WriteLine("TRANSACAO {0} CANCELADA COM SUCESSO.",
                                  cancelation.StoneId);

                TransactionTableEntry transaction = this.Transactions
                                                    .Where(t => t.StoneId == cancelation.StoneId)
                                                    .FirstOrDefault();

                if (transaction != null)
                {
                    transaction.IsCaptured = false;
                }
            }
            else
            {
                Console.WriteLine("TRANSACAO {0} NAO PODE SER CANCELADA.",
                                  cancelation.StoneId);
            }
        }
        /// <summary>
        /// Turns a command string into a <see cref="CancelationOption"/>.
        /// </summary>
        /// <param name="payCommand">Cancelation command from command line.</param>
        /// <returns>The class with cancelation properties.</returns>
        public static CancelationOption DecodeCancelation(this string cancelationCommand)
        {
            string[]          args        = cancelationCommand.Split(' ');
            CancelationOption cancelation = new CancelationOption();

            CommandLine.Parser.Default.ParseArguments(args, cancelation);

            return(cancelation);
        }
        /// <summary>
        /// Decodes the command name and performs the corresponding action.
        /// The commands supported are:
        ///     - "ativar": activate and connect to one terminal;
        ///     - "pagar": pay something;
        ///     - "resumo": transaction sumamry, it can be filtered by approved
        ///     transactions, not approved or cancelled transactions or all transactions;
        ///     - "cancel": cancel a transaction by it's Stone ID;
        ///     - "sair": disconnect from the terminal and exit the application.
        /// </summary>
        /// <param name="command">Command typed by the user.</param>
        /// <returns>Whether it has to exit the application or not.</returns>
        public static bool Decode(this string command)
        {
            string[] args        = command.Split(' ');
            string   commandName = args[0];
            string   baseCommand = string.Join(" ", args, 1, args.Length - 1);

            switch (commandName)
            {
            case "ativar":
                ActivateOption activation = baseCommand.DecodeActivation();
                AuthorizationCore.GetInstance()
                .TryActivate(activation);
                break;

            case "pagar":
                TransactionOption transaction = baseCommand.DecodeTransaction();
                AuthorizationCore.GetInstance()
                .Authorize(transaction);
                break;

            case "resumo":
                ShowTransactionsOption showOptions = baseCommand.DecodeShowTransactions();
                AuthorizationCore.GetInstance()
                .ShowTransactions(showOptions);
                break;

            case "cancelar":
                CancelationOption cancelation = baseCommand.DecodeCancelation();
                AuthorizationCore.GetInstance()
                .Cancel(cancelation);
                break;

            case "sair":
                AuthorizationCore.GetInstance()
                .ClosePinpad();
                return(true);
            }

            return(false);
        }