private Boolean CanAddElement(CompensationProvision element, DateValidationType dateValidationType)
            {
                Boolean isValid = false;
                switch (dateValidationType)
                {
                    case DateValidationType.ALL:
                        isValid = true;
                        break;
                    case DateValidationType.HISTORICAL:
                        if (DateTime.Compare(element.ValidTo, DateTime.Now) < 0)
                        {
                            isValid = true;
                        }
                        break;
                    case DateValidationType.ACTIVE:
                        if (!element.IsClosed &&
                            DateTime.Compare(element.ValidFrom, DateTime.Now) < 0 &&
                            DateTime.Compare(element.ValidTo, DateTime.Now) > 0)
                        {
                            isValid = true;
                        }
                        break;
                    case DateValidationType.ACTIVE_AND_FUTURE:
                        if (!element.IsClosed)
                        {
                            if (DateTime.Compare(element.ValidFrom, DateTime.Now) < 0 &&
                                DateTime.Compare(element.ValidTo, DateTime.Now) > 0) //Active
                            {
                                isValid = true;
                            }
                            if (DateTime.Compare(element.ValidFrom, DateTime.Now) > 0) //Future
                            {
                                isValid = true;
                            }
                        }
                        break;
                    case DateValidationType.FUTURE:
                        if (!element.IsClosed &&
                            DateTime.Compare(element.ValidFrom, DateTime.Now) > 0)
                        {
                            isValid = true;
                        }
                        break;
                    default:
                        isValid = false;
                        break;
                }

                return isValid;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="newKind"></param>
            /// <param name="persistentObject"></param>
            /// <param name="conditionQuantity"></param>
            /// <param name="validFrom"></param>
            /// <param name="validTo"></param>
            /// <returns></returns>
            public CompensationProvision NewCompensationProvision(
                CompensationProvision.Kind newKind,
                Something persistentObject,
                Decimal conditionQuantity,
                DateTime validFrom,
                DateTime validTo)
            {
                CompensationProvision compensationProvision;
                //New instance of the specified type.
                if (newKind != null)
                {
                    compensationProvision = (CompensationProvision)newKind.New();
                }
                else
                {
                    compensationProvision = new CompensationProvision();
                }

                //Initiate.
                compensationProvision.ConditionQuantity = conditionQuantity;
                compensationProvision.SetAppliesTo(persistentObject);
                compensationProvision.ValidFrom = validFrom;
                compensationProvision.ValidTo = validTo;
                compensationProvision.IsClosed = false;

                return compensationProvision;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="wantedType"></param>
            /// <param name="includedIn"></param>
            /// <param name="persistentObject"></param>
            /// <param name="percent"></param>
            /// <param name="quantity"></param>
            /// <param name="validFrom"></param>
            /// <param name="validTo"></param>
            /// <returns></returns>
            public CompensationProvision NewRelativeDeduction(
                CompensationProvision.Kind wantedType,
                AgreedCompensation includedIn,
                Something persistentObject,
                Decimal percent,
                Decimal quantity,
                DateTime validFrom,
                DateTime validTo)
            {
                //Instantiate the new charge.
                CompensationProvision compensationProvision = NewCompensationProvision(
                    wantedType,
                    persistentObject,
                    quantity,
                    validFrom,
                    validTo);

                //Initiate
                compensationProvision.SetAppliesTo(persistentObject);
                compensationProvision.SetAgreedCompensation(includedIn);
                compensationProvision.AddPercent = -percent;
                compensationProvision.IsRelative = true;
                return compensationProvision;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="wantedType"></param>
            /// <param name="includedIn"></param>
            /// <param name="persistentObject"></param>
            /// <param name="amount"></param>
            /// <param name="quantity"></param>
            /// <param name="currencyKind"></param>
            /// <param name="validFrom"></param>
            /// <param name="validTo"></param>
            /// <returns></returns>
            public CompensationProvision NewCharge(
                CompensationProvision.Kind wantedType,
                AgreedCompensation includedIn,
                Something persistentObject,
                Decimal amount,
                Decimal quantity,
                Currency.Kind currencyKind,
                DateTime validFrom,
                DateTime validTo)
            {
                //Instantiate the new charge.
                CompensationProvision compensationProvision = NewCompensationProvision(wantedType, persistentObject, quantity, validFrom, validTo);

                //Initiate
                compensationProvision.CurrencyKind = currencyKind;
                compensationProvision.SetAppliesTo(persistentObject);
                compensationProvision.SetAgreedCompensation(includedIn);
                compensationProvision.Amount = amount;
                compensationProvision.IsRelative = false;
                return compensationProvision;
            }