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 }); } } }
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)); }
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)); } }
public void TestInitialize() { _refunder = new RefundCalculator(); }
public void RefundCalculator_WhenLessThan5QuartersInVault_ExactChangeOnly() { var calculator = new RefundCalculator(); Assert.IsFalse(calculator.CanMakeChange(Enumerable.Repeat(Coin.Quarter, 4))); }
public void RefundCalculator_WhenNoCoinsInVault_ExactChangeOnly() { var calculator = new RefundCalculator(); Assert.IsFalse(calculator.CanMakeChange(Enumerable.Empty <Coin>())); }
public override string Display() { var refundCalculator = new RefundCalculator(); return(refundCalculator.CanMakeChange(Vault) ? "INSERT COIN" : "EXACT CHANGE ONLY"); }