public static bool DoesNotContainEarningForCommitmentAndPaymentType(
            this List <PriceEpisodePeriodMatchEntity> source,
            RawEarning earning,
            DasCommitment commitment,
            TransactionTypesFlag paymentType)
        {
            if (source.FirstOrDefault(x => x.MatchesEarning(earning) &&
                                      x.MatchesCommitment(commitment) &&
                                      x.Payable &&
                                      x.TransactionTypesFlag == paymentType) == null)
            {
                return(true);
            }

            return(false);
        }
        public void Add(RawEarning earning, List <string> errors, TransactionTypesFlag paymentType, DasCommitment commitment)
        {
            var payable = false;

            if (errors.Any())
            {
                foreach (var error in errors)
                {
                    if (ValidationErrors.DoesNotAlreadyContainEarningForThisError(earning, error) &&
                        PriceEpisodePeriodMatches.DoesNotContainEarningForCommitmentAndPaymentType(earning, commitment, paymentType))
                    {
                        ValidationErrors.Add(new DatalockValidationError
                        {
                            LearnRefNumber         = earning.LearnRefNumber,
                            AimSeqNumber           = earning.AimSeqNumber,
                            PriceEpisodeIdentifier = earning.PriceEpisodeIdentifier,
                            RuleId = error,
                            Ukprn  = earning.Ukprn,
                        });
                    }

                    if (ValidationErrorsByPeriod.DoesNotAlreadyContainEarningForThisError(earning, error))
                    {
                        ValidationErrorsByPeriod.Add(new DatalockValidationErrorByPeriod()
                        {
                            LearnRefNumber         = earning.LearnRefNumber,
                            AimSeqNumber           = earning.AimSeqNumber,
                            PriceEpisodeIdentifier = earning.PriceEpisodeIdentifier,
                            RuleId = error,
                            Ukprn  = earning.Ukprn,
                            Period = earning.Period,
                        });
                    }
                }
            }
            else
            {
                payable = true;
            }

            if (commitment == null)
            {
                return;
            }

            PriceEpisodePeriodMatches.Add(new PriceEpisodePeriodMatchEntity
            {
                AimSeqNumber           = earning.AimSeqNumber,
                CommitmentId           = commitment.CommitmentId,
                LearnRefNumber         = earning.LearnRefNumber,
                PriceEpisodeIdentifier = earning.PriceEpisodeIdentifier,
                Period = earning.Period,
                TransactionTypesFlag = paymentType,
                Payable   = payable,
                Ukprn     = earning.Ukprn,
                VersionId = commitment.VersionId,
            });

            if (payable)
            {
                var validationErrorsToRemove = ValidationErrors.Where(x =>
                                                                      x.Ukprn == earning.Ukprn &&
                                                                      x.LearnRefNumber == earning.LearnRefNumber &&
                                                                      x.PriceEpisodeIdentifier == earning.PriceEpisodeIdentifier)
                                               .ToList();

                foreach (var validationError in validationErrorsToRemove)
                {
                    ValidationErrors.Remove(validationError);
                }
            }

            if (PriceEpisodeMatches.DoesNotAlreadyContainEarningForCommitment(earning, commitment, payable))
            {
                PriceEpisodeMatches.Add(new PriceEpisodeMatchEntity
                {
                    CommitmentId           = commitment.CommitmentId,
                    IsSuccess              = payable,
                    LearnRefNumber         = earning.LearnRefNumber,
                    PriceEpisodeIdentifier = earning.PriceEpisodeIdentifier,
                    Ukprn        = earning.Ukprn,
                    AimSeqNumber = earning.AimSeqNumber,
                });
            }
        }