public List <(byte deliveryPeriod, RequiredPayment payment)> RefundLearningAim(List <Payment> historicPayments) { return(historicPayments .GroupBy(payment => payment.DeliveryPeriod) .SelectMany(group => { var historicPaymentsPerPeriod = group.ToList(); var payments = refundService.GetRefund(paymentDueProcessor.CalculateRequiredPaymentAmount(0, historicPaymentsPerPeriod), historicPaymentsPerPeriod); return payments.Select(payment => (group.Key, payment)); }) .ToList()); }
public List <RequiredPayment> GetRequiredPayments(Earning earning, List <Payment> paymentHistory) { var result = new List <RequiredPayment>(); if (earning.EarningType != EarningType.Incentive && earning.SfaContributionPercentage.HasValue) { result.AddRange(RefundPaymentsWithDifferentSfaContribution(earning.SfaContributionPercentage.Value, paymentHistory)); } var validPaymentHistory = paymentHistory .Where(p => earning.EarningType == EarningType.Incentive || !earning.SfaContributionPercentage.HasValue || p.SfaContributionPercentage == earning.SfaContributionPercentage) .ToList(); var amount = paymentsDue.CalculateRequiredPaymentAmount(earning.Amount, validPaymentHistory); if (amount < 0) { result.AddRange(refundService.GetRefund(amount, validPaymentHistory)); return(result); } if (amount == 0) { return(result); } if (!earning.SfaContributionPercentage.HasValue) { throw new ArgumentException("Trying to use a null SFA Contribution % for a positive earning"); } result.Add(new RequiredPayment { Amount = amount, EarningType = earning.EarningType, SfaContributionPercentage = earning.SfaContributionPercentage.Value, PriceEpisodeIdentifier = earning.PriceEpisodeIdentifier, AccountId = earning.AccountId, TransferSenderAccountId = earning.TransferSenderAccountId }); return(result); }