public void AddFee_AddFixedFeeToFirstFeeOnly()
        {
            // Arrange
            var feeType = new InvoiceFixedFee(29.00M);

            var xJan1_1 = new Fee("x", new DateTime(2019, 01, 01), 100M);
            var xJan1_2 = new Fee("x", new DateTime(2019, 01, 01), 100M);
            var xJan2_1 = new Fee("x", new DateTime(2019, 01, 02), 100M);
            var xFeb1_1 = new Fee("x", new DateTime(2019, 02, 01), 100M);
            var xFeb1_2 = new Fee("x", new DateTime(2019, 02, 01), 100M);
            var xFeb2_1 = new Fee("x", new DateTime(2019, 02, 02), 100M);

            var yJan2_1 = new Fee("y", new DateTime(2019, 01, 02), 100M);
            var yJan2_2 = new Fee("y", new DateTime(2019, 01, 02), 100M);
            var yFeb1_1 = new Fee("y", new DateTime(2019, 02, 01), 100M);
            var yFeb1_2 = new Fee("y", new DateTime(2019, 02, 01), 100M);
            var yFeb2_1 = new Fee("y", new DateTime(2019, 02, 02), 100M);

            // Act
            var xJan1_1_result = feeType.AddFee(xJan1_1);
            var xJan1_2_result = feeType.AddFee(xJan1_2);
            var xJan2_1_result = feeType.AddFee(xJan2_1);
            var xFeb1_1_result = feeType.AddFee(xFeb1_1);
            var xFeb1_2_result = feeType.AddFee(xFeb1_2);
            var xFeb2_1_result = feeType.AddFee(xFeb2_1);

            var yJan2_1_result = feeType.AddFee(yJan2_1);
            var yJan2_2_result = feeType.AddFee(yJan2_2);
            var yFeb1_1_result = feeType.AddFee(yFeb1_1);
            var yFeb1_2_result = feeType.AddFee(yFeb1_2);
            var yFeb2_1_result = feeType.AddFee(yFeb2_1);

            // Assert
            Assert.True(new[]
            {
                xJan1_1_result,
                xFeb1_1_result,
                yJan2_1_result,
                yFeb1_1_result
            }.All(fee => fee.Amount == 129M));

            Assert.True(new[]
            {
                xJan1_2_result,
                xJan2_1_result,
                xFeb1_2_result,
                xFeb2_1_result,
                yJan2_2_result,
                yFeb1_2_result,
                yFeb2_1_result,
            }
                        .All(fee => fee.Amount == 100M));
        }
Beispiel #2
0
        private static FeeCalculationCommand BuildFeeCalculationCommand(MpConfig config, params object[] dependencies)
        {
            var defaultFee = new PercentageFee(
                config.Fees.PercentageFee,
                config.Fees.MinAllowedFeeAmount);
            var feeDiscount = new DiscountedFee(
                config.Fees.DiscountedFees,
                config.Fees.MinAllowedFeeAmount);
            var fixedFee = new InvoiceFixedFee(
                config.Fees.InvoiceFixedFee,
                config.Fees.MinAllowedFeeAmount);
            var extraFees = new IExtraFee[] { feeDiscount, fixedFee };

            ITransactionRepository transactionRepository =
                dependencies
                .OfType <ITransactionRepository>()
                .FirstOrDefault() ??
                new TransactionRepository(
                    config.Input.TransactionsFilePath,
                    new FileReader(),
                    new TransactionParser(
                        config.Input.Separator,
                        config.Input.DateFormat));
            IFeeCalculationService feeCalculationService =
                dependencies
                .OfType <IFeeCalculationService>()
                .FirstOrDefault() ??
                new FeeCalculationService(
                    new BaseFeeCalculator(defaultFee, new Dictionary <string, ITransactionFee>()),
                    extraFees,
                    new Mapper());

            IOutputWriter outputWriter =
                dependencies
                .OfType <IOutputWriter>()
                .FirstOrDefault() ??
                new OutputWriter(
                    config.Output.DateFormat,
                    config.Output.AmountFormat,
                    config.Output.MerchantNameMinimalWidth);

            var command = new FeeCalculationCommand(
                transactionRepository,
                feeCalculationService,
                outputWriter);

            return(command);
        }