protected StatutoryCalculationResult <PaternityPayAssessment> GetSppCalculation(int taxYear, PaternityPayAssessment assessment) { var sppEngine = statutoryFactory.CreateSppCalculationEngine(taxYear); return(sppEngine.Calculate(assessment)); }
public StatutoryCalculationResult <PaternityPayAssessment> Calculate(PaternityPayAssessment model) { var assessmentCalculation = new StatutoryCalculationResult <PaternityPayAssessment>(); if (!model.UpcomingPaymentDate.HasValue) { assessmentCalculation.AddError(StatutoryValidationError.MissingRequiredValue, "The next Upcoming Payment Date must be provided"); } if (!model.StartDate.HasValue) { assessmentCalculation.AddError(StatutoryValidationError.MissingRequiredValue, "The Start Date must be provided"); } if (!model.BirthDate.HasValue) { assessmentCalculation.AddError(StatutoryValidationError.MissingRequiredValue, "The Birth Date must be provided"); } if (model.UpcomingPaymentDate.HasValue && model.StartDate.HasValue && model.UpcomingPaymentDate.Value < model.StartDate.Value) { assessmentCalculation.AddError(StatutoryValidationError.InvalidUpcomingPayDate, "The upcoming process date cannot be before the Start Date"); } if (model.BirthDate.HasValue && model.StartDate.HasValue && model.StartDate.Value < model.BirthDate.Value) { assessmentCalculation.AddError(StatutoryValidationError.InvalidStartDate, "Paternity pay cannot be started before the birth date"); } if (assessmentCalculation.Errors.Any()) { return(assessmentCalculation); } if (!model.EndDate.HasValue) { model.EndDate = model.StartDate?.AddDays(model.TotalClaimDays); } assessmentCalculation.IsEligible = model.IsEligible; var scheduledPayments = new List <StatutoryPayment>(); var datesInRange = model.GetQualifyingDatesInRange(); var nextPaymentDate = (model.UpcomingPaymentDate.Value >= datesInRange.First() ? model.UpcomingPaymentDate.Value : model.UpcomingPaymentDate.Value.AddDays(7)); var statPayment = new StatutoryPayment { ReferenceDate = nextPaymentDate, PaymentDate = nextPaymentDate.AddDays(7), Cost = taxYearConfigurationData.StatutoryPaternityPayDayRate, Qty = 0m }; foreach (var claimDate in datesInRange) { if (claimDate > nextPaymentDate) { scheduledPayments.Add(statPayment); // Next payment is one week away, Fort/Monthly change nextPaymentDate = nextPaymentDate.AddDays(7); statPayment = new StatutoryPayment { ReferenceDate = nextPaymentDate, PaymentDate = nextPaymentDate.AddDays(7), Cost = taxYearConfigurationData.StatutoryPaternityPayDayRate, Qty = 0m }; } // We do want to pay this date statPayment.Qty += 1m; } // Add the last period scheduledPayments.Add(statPayment); // Filter out empty schedules assessmentCalculation.Payments = scheduledPayments.Where(m => m.Qty > 0).Select(m => m); return(assessmentCalculation); }
public MockPaternityPayAssessment() { Assessment = new PaternityPayAssessment(); }