public void FeeCalculator_ShouldAddMonthlyFee_WhenAtLeastOneTransaction() { // We check following requirementInvoice Fee should be included in the fee for first transaction of the month // Arrange var merchants = new Dictionary <string, Merchant>(); merchants.Add(sevenEleven, new Merchant() { DiscountPercentage = 0, Name = sevenEleven, FeeAsPercentage = 1 }); merchants.Add(circleK, new Merchant() { DiscountPercentage = 0, Name = circleK, FeeAsPercentage = 2 }); List <Transaction> transactions = new List <Transaction> { new Transaction { DoneOn = new DateTime(2018, 9, 1), Amount = 100, Owner = merchants[sevenEleven] }, new Transaction { DoneOn = new DateTime(2018, 9, 19), Amount = 100, Owner = merchants[sevenEleven] }, new Transaction { DoneOn = new DateTime(2018, 10, 19), Amount = 100, Owner = merchants[circleK] }, }; var calculator = new FeeCalculator(); // Act calculator.InitializeFeeCalculation(); var processedFirstTransaction = calculator.CalculateFee(transactions[0]); var processedSecondTransaction = calculator.CalculateFee(transactions[1]); var processedThirdTransaction = calculator.CalculateFee(transactions[2]); // Assert // Month #9 Assert.Equal(30M, processedFirstTransaction.Fee); Assert.Equal(sevenEleven, processedFirstTransaction.RelatedTransaction.Owner.Name); Assert.Equal(new DateTime(2018, 9, 1), processedFirstTransaction.RelatedTransaction.DoneOn); Assert.Equal(1M, processedSecondTransaction.Fee); Assert.Equal(sevenEleven, processedSecondTransaction.RelatedTransaction.Owner.Name); Assert.Equal(new DateTime(2018, 9, 19), processedSecondTransaction.RelatedTransaction.DoneOn); // Month #10 Assert.Equal(31M, processedThirdTransaction.Fee); Assert.Equal(circleK, processedThirdTransaction.RelatedTransaction.Owner.Name); Assert.Equal(new DateTime(2018, 10, 19), processedThirdTransaction.RelatedTransaction.DoneOn); }
public void CalculateFeeTest() { string wendyJson = Resource.GetResourceAsString("Wendy.json"); var invoiceHistory = JsonUtil.DeserializeJson <Model.InvoiceHistory>(wendyJson); var invoiceHistoryForAsserts = JsonUtil.DeserializeJson <Model.InvoiceHistory>(wendyJson); var consumptionCalc = new ConsumptionCalculator(invoiceHistory); var feeCalc = new FeeCalculator(invoiceHistory); consumptionCalc.CalculateConsumption(); { int invoiceId = 0; // balanced feeCalc.CalculateFee(invoiceId); AssertInvoicesFee(invoiceHistoryForAsserts.Invoices.GetInvoiceById(invoiceId), invoiceHistory.Invoices.GetInvoiceById(invoiceId)); } { int invoiceId = 14; // estimated feeCalc.CalculateFee(invoiceId); AssertInvoicesFee(invoiceHistoryForAsserts.Invoices.GetInvoiceById(invoiceId), invoiceHistory.Invoices.GetInvoiceById(invoiceId)); } { int invoiceId = 15; // estimated feeCalc.CalculateFee(invoiceId); AssertInvoicesFee(invoiceHistoryForAsserts.Invoices.GetInvoiceById(invoiceId), invoiceHistory.Invoices.GetInvoiceById(invoiceId)); } { int invoiceId = 16; // estimated feeCalc.CalculateFee(invoiceId); AssertInvoicesFee(invoiceHistoryForAsserts.Invoices.GetInvoiceById(invoiceId), invoiceHistory.Invoices.GetInvoiceById(invoiceId)); } { int invoiceId = 17; // balanced feeCalc.CalculateFee(invoiceId); AssertInvoicesFee(invoiceHistoryForAsserts.Invoices.GetInvoiceById(invoiceId), invoiceHistory.Invoices.GetInvoiceById(invoiceId)); } }
public void FeeCalculator_ShouldNotAddMonthlyFee_WhenFeeIsZero() { // IWe check following requirement-If transaction fee is 0 after applying discounts, InvoiceFee should not be added // Arrange var merchants = new Dictionary <string, Merchant>(); merchants.Add(sevenEleven, new Merchant() { DiscountPercentage = 0, Name = sevenEleven, FeeAsPercentage = 0 }); List <Transaction> transactions = new List <Transaction> { new Transaction { DoneOn = new DateTime(2018, 9, 1), Amount = 100, Owner = merchants[sevenEleven] }, new Transaction { DoneOn = new DateTime(2018, 9, 19), Amount = 100, Owner = merchants[sevenEleven] }, }; var calculator = new FeeCalculator(); // Act calculator.InitializeFeeCalculation(); var processedFirstTransactions = calculator.CalculateFee(transactions[0]); var processedSecondTransaction = calculator.CalculateFee(transactions[1]); // Assert // Month #9 Assert.Equal(0, processedFirstTransactions.Fee); Assert.Equal(sevenEleven, processedFirstTransactions.RelatedTransaction.Owner.Name); Assert.Equal(new DateTime(2018, 9, 1), processedFirstTransactions.RelatedTransaction.DoneOn); Assert.Equal(0, processedSecondTransaction.Fee); Assert.Equal(sevenEleven, processedSecondTransaction.RelatedTransaction.Owner.Name); Assert.Equal(new DateTime(2018, 9, 19), processedSecondTransaction.RelatedTransaction.DoneOn); }
public InternalTransferPaymentTransactions MakeInternalTransfer(Wallet toWallet, decimal amount) { CheckIfWalletIsBlocked(); toWallet.CheckIfWalletIsBlocked(); decimal feeAmount = FeeCalculator.CalculateFee(this, amount); bool isWithdrawalLimitExceeded = LimitPaymentTransactionCalculator.IsWithdrawalLimitExceed(this, amount); if (isWithdrawalLimitExceeded) { throw new LimitExceededException(); } bool isDepositLimitExceeded = LimitPaymentTransactionCalculator.IsDepositLimitExceed(toWallet, amount); if (isDepositLimitExceeded) { throw new LimitExceededException(); } if (CurrentAmount < amount + feeAmount) { throw new NotEnoughAmountException(); } string internalTransferId = Guid.NewGuid().ToString(); var deposit = new DepositInternalTransferPaymentTransaction(toWallet, this, amount, internalTransferId); var withdrawal = new WithdrawalInternalTransferPaymentTransaction(this, toWallet, amount, internalTransferId); FeeInternalTransferPaymentTransaction feePaymentTransaction = new FeeInternalTransferPaymentTransaction(this, toWallet, feeAmount, internalTransferId); this.CurrentAmount -= amount; toWallet.CurrentAmount += amount; PaymentTransactions.Add(withdrawal); toWallet.PaymentTransactions.Add(deposit); var internalTransferPaymentTransactions = new InternalTransferPaymentTransactions(deposit, withdrawal, feePaymentTransaction); if (internalTransferPaymentTransactions.HasFee()) { this.CurrentAmount -= feeAmount; PaymentTransactions.Add(feePaymentTransaction); } return(internalTransferPaymentTransactions); }
public void FeeCalculator_ShouldCalculateFee_WhenDiscountProvided(string merchantName, string stringifiedTransactionDate, decimal percentageFee, decimal transactionAmount, decimal discount, decimal expectedFee) { // Arrange var calculator = new FeeCalculator(); DateTime transactionDate; var transactionDateValid = DateTime.TryParseExact(stringifiedTransactionDate, "yyyy-MM-dd", null, DateTimeStyles.None, out transactionDate); var merchant = new Merchant() { Name = merchantName, FeeAsPercentage = percentageFee, DiscountPercentage = discount }; var transaction = new Transaction() { Owner = merchant, Amount = transactionAmount, DoneOn = transactionDate }; // Act calculator.InitializeFeeCalculation(); var processedTransaction = calculator.CalculateFee(transaction); // Assert Assert.True(transactionDateValid); Assert.Equal(expectedFee, processedTransaction.Fee); }