Exemple #1
0
        public IDictionary <ICurrencyDenomination, int> GetChange(PurchaseTransaction transaction, IEnumerable <ICurrencyDenomination> denominationsAvailable)
        {
            decimal amountChangeDue  = transaction.AmountReceived - transaction.AmountOwed;
            var     changeCalculator = GetCalculator(transaction.AmountOwed);

            return(changeCalculator.GetChange(amountChangeDue, denominationsAvailable));
        }
        public IEnumerable <PurchaseTransaction> GetPurchaseTransactions()
        {
            List <PurchaseTransaction> purchaseTransactions = new List <PurchaseTransaction>();

            using (StreamReader fileStreamReader = File.OpenText(_filePath))
            {
                int    fileLineNumber = 1;
                string transactionLine;

                while ((transactionLine = fileStreamReader.ReadLine()) != null)
                {
                    // Assume any blank line is the end of the file, so that we can skip any remaining new lines at the end of the file.
                    if (String.IsNullOrWhiteSpace(transactionLine))
                    {
                        break;
                    }

                    string[] transactionAmounts = transactionLine.Split(',');

                    // Check for an incorrect number of parameters for our expected input
                    if (transactionAmounts.Length != 2)
                    {
                        throw new Exception(String.Format(UNEXPECTED_INPUT, transactionLine, fileLineNumber, _filePath));
                    }

                    PurchaseTransaction transaction = new PurchaseTransaction();
                    decimal             amountOwed;
                    decimal             amountReceived;
                    bool amountOwedParseSuccess     = Decimal.TryParse(transactionAmounts[0], out amountOwed);
                    bool amountReceivedParseSuccess = Decimal.TryParse(transactionAmounts[1], out amountReceived);

                    // Check that the values received are decimal values
                    if (!amountOwedParseSuccess || !amountReceivedParseSuccess)
                    {
                        throw new Exception(String.Format(UNEXPECTED_INPUT, transactionLine, fileLineNumber, _filePath));
                    }

                    transaction.AmountOwed     = amountOwed;
                    transaction.AmountReceived = amountReceived;

                    purchaseTransactions.Add(transaction);

                    fileLineNumber++;
                }
            }

            return(purchaseTransactions);
        }
        public string CalculateChange(PurchaseTransaction transaction)
        {
            string output;

            if (transaction.AmountReceived < 0)
            {
                output = NEGATIVE_RECEIVED_AMOUNT;
            }
            else if (transaction.AmountReceived > transaction.AmountOwed)
            {
                IDictionary <ICurrencyDenomination, int> denominationsDue = _changeCalculationStrategy.GetChange(transaction, DenominationsInRegister);
                StringBuilder denominationAmountsStringBuilder            = new StringBuilder();

                foreach (KeyValuePair <ICurrencyDenomination, int> denomination in denominationsDue)
                {
                    int    numberOfTheDenomination = denomination.Value;
                    string denominationName;
                    if (denomination.Key is UsCurrencyDenomination)
                    {
                        UsCurrencyDenomination usCurrencyDenomination = (UsCurrencyDenomination)denomination.Key;
                        denominationName = numberOfTheDenomination > 1
                            ? usCurrencyDenomination.PluralizedName
                            : usCurrencyDenomination.Name;
                    }
                    else
                    {
                        denominationName = denomination.Key.Name;
                    }

                    denominationAmountsStringBuilder.Append(numberOfTheDenomination + " " + denominationName + ", ");
                }

                // Remove trailing comma
                output = denominationAmountsStringBuilder.Remove(denominationAmountsStringBuilder.Length - 2, 2).ToString();
            }
            else if (transaction.AmountReceived == transaction.AmountOwed)
            {
                output = NO_CHANGE_REQUIRED_MESSAGE;
            }
            else
            {
                decimal amountStillDue = transaction.AmountOwed - transaction.AmountReceived;
                output = String.Format(INSUFFICIENT_FUNDS_RECEIVED, amountStillDue.ToString("C", NumberFormatInfo.CurrentInfo));
            }

            return(output);
        }
        public IDictionary <ICurrencyDenomination, int> GetChange(PurchaseTransaction transaction, IEnumerable <ICurrencyDenomination> denominationsAvailable)
        {
            var changeCalculator = new LargestDenominationFirstChangeCalculator();

            return(changeCalculator.GetChange(transaction.AmountReceived - transaction.AmountOwed, denominationsAvailable));
        }
Exemple #5
0
 private static void OutputChange(CashRegister cashRegister, PurchaseTransaction transaction)
 {
     Console.WriteLine(cashRegister.CalculateChange(transaction));
 }