public override IEnumerable <InvoiceItem> CreateRefundItems(CarePackage package, IList <InvoiceDomain> packageInvoices)
        {
            var oneOffs = package.Details.Where(d => d.CostPeriod == PaymentPeriod.OneOff);

            foreach (var detail in oneOffs)
            {
                var refunds = RefundCalculator.Calculate(
                    detail, packageInvoices,
                    (paymentRange, quantity) => CalculateCostForPeriod(detail, paymentRange));

                foreach (var refund in refunds)
                {
                    yield return(new InvoiceItem
                    {
                        Name = $"{GetDetailItemName(detail)} (adjustment)",
                        Quantity = 1,
                        WeeklyCost = 0.0m,
                        TotalCost = refund.Amount,
                        FromDate = refund.StartDate,
                        ToDate = (detail.EndDate is null)
                            ? refund.StartDate // ongoing one-offs are infinite, so voluntarily limit end date to same day as start
                            : refund.EndDate,
                        CarePackageDetailId = detail.Id,
                        SourceVersion = detail.Version,
                        PriceEffect = refund.Amount > 0
                            ? PriceEffect.Add
                            : PriceEffect.Subtract
                    });
        public override IEnumerable <InvoiceItem> CreateRefundItems(CarePackage package, IList <InvoiceDomain> packageInvoices)
        {
            var weeklyDetails = package.Details.Where(d => d.CostPeriod == PaymentPeriod.Weekly);

            foreach (var detail in weeklyDetails)
            {
                var refunds = RefundCalculator.Calculate(
                    detail, packageInvoices,
                    (paymentRange, quantity) => detail.Cost * quantity);

                foreach (var refund in refunds)
                {
                    yield return(new InvoiceItem
                    {
                        Name = $"{GetDetailItemName(detail)} (adjustment)",
                        Quantity = refund.Quantity,
                        WeeklyCost = detail.Cost,
                        TotalCost = refund.Amount,
                        FromDate = refund.StartDate,
                        ToDate = refund.EndDate,
                        CarePackageDetailId = detail.Id,
                        SourceVersion = detail.Version,
                        PriceEffect = refund.Amount > 0
                            ? PriceEffect.Add
                            : PriceEffect.Subtract
                    });
                }
            }
        }
        public override IEnumerable <InvoiceItem> CreateRefundItems(CarePackage package, IList <InvoiceDomain> packageInvoices)
        {
            var fundedNursingCare = package.Reclaims
                                    .Where(r => r.Type is ReclaimType.Fnc)
                                    .ToList();

            foreach (var reclaim in fundedNursingCare)
            {
                var refunds = RefundCalculator.Calculate(
                    reclaim, packageInvoices,
                    (paymentRange, quantity) => CalculateFncPriceForPeriod(paymentRange, reclaim));

                foreach (var refund in refunds)
                {
                    yield return(new InvoiceItem
                    {
                        Name = $"Funded Nursing Care (adjustment) {FormatDescription(reclaim.Description)}",
                        Quantity = refund.Quantity,
                        WeeklyCost = GetPriceForDate(refund.StartDate),
                        TotalCost = refund.Amount,
                        FromDate = refund.StartDate,
                        ToDate = refund.EndDate,
                        CarePackageReclaimId = reclaim.Id,
                        SourceVersion = reclaim.Version,
                        PriceEffect = refund.Amount > 0
                            ? PriceEffect.Add
                            : PriceEffect.Subtract
                    });
                }
            }
        }
コード例 #4
0
        public void RefundCalculator_When5OfEachDenominationInVault_CanMakeChange()
        {
            var calculator = new RefundCalculator();
            var vault      = Enumerable.Repeat(Coin.Nickel, 5)
                             .Concat(Enumerable.Repeat(Coin.Dime, 5))
                             .Concat(Enumerable.Repeat(Coin.Quarter, 5));

            Assert.IsTrue(calculator.CanMakeChange(vault));
        }
コード例 #5
0
        public void Refund(int currentTotal, int?priceInCents)
        {
            var calculator = new RefundCalculator();
            var refund     = calculator.CalculateRefund(priceInCents ?? 0, currentTotal);

            foreach (var coinCount in refund)
            {
                ReturnTray.AddRange(Enumerable.Repeat(coinCount.Key, coinCount.Value));
            }
        }
コード例 #6
0
 public void TestInitialize()
 {
     _refunder = new RefundCalculator();
 }
コード例 #7
0
        public void RefundCalculator_WhenLessThan5QuartersInVault_ExactChangeOnly()
        {
            var calculator = new RefundCalculator();

            Assert.IsFalse(calculator.CanMakeChange(Enumerable.Repeat(Coin.Quarter, 4)));
        }
コード例 #8
0
        public void RefundCalculator_WhenNoCoinsInVault_ExactChangeOnly()
        {
            var calculator = new RefundCalculator();

            Assert.IsFalse(calculator.CanMakeChange(Enumerable.Empty <Coin>()));
        }
コード例 #9
0
        public override string Display()
        {
            var refundCalculator = new RefundCalculator();

            return(refundCalculator.CanMakeChange(Vault) ? "INSERT COIN" : "EXACT CHANGE ONLY");
        }