public static ProductFeatureApplicability Create(ProductFeature feature, FinancialProduct financialProduct, DateTime today)
        {
            ProductFeatureApplicability applicability = new ProductFeatureApplicability();
            applicability.FinancialProduct = financialProduct;
            applicability.EffectiveDate = today;
            applicability.ProductFeature = feature;

            Context.ProductFeatureApplicabilities.AddObject(applicability);
            return applicability;
        }
        public static ProductFeatureApplicability CreateOrUpdate(ProductFeature feature, FinancialProduct financialProduct, DateTime today)
        {
            ProductFeatureApplicability current = GetActive(feature, financialProduct);
            if (current != null)
                current.EndDate = today;

            ProductFeatureApplicability applicability = new ProductFeatureApplicability();
            applicability.FinancialProduct = financialProduct;
            applicability.EffectiveDate = today;
            applicability.ProductFeature = feature;

            Context.ProductFeatureApplicabilities.AddObject(applicability);
            return applicability;
        }
        public static ProductFeatureApplicability CreateOrUpdate(ProductFeature feature, FinancialProduct financialProduct, decimal? value , DateTime today)
        {
            ProductFeatureApplicability current = GetActive(feature, financialProduct);
            if (current != null && current.Value == value)
                return current;

            bool createNew = (current != null && current.Value != value) || current == null;
            if (current != null && current.Value != value)
                current.EndDate = today;

            if (createNew)
            {
                ProductFeatureApplicability applicability = new ProductFeatureApplicability();
                applicability.FinancialProduct = financialProduct;
                applicability.EffectiveDate = today;
                applicability.ProductFeature = feature;
                applicability.Value = value;

                Context.ProductFeatureApplicabilities.AddObject(applicability);
                return applicability;
            }

            return current;
        }
 public static ApplicationItem Get(Application application, ProductFeature productFeature)
 {
     return Context.ApplicationItems.FirstOrDefault(entity => entity.EndDate == null
         && entity.ProductFeatureApplicability.ProductFeature.Id == productFeature.Id
         && entity.ApplicationId == application.Id);
 }
        public static ProductFeatureApplicability UpdateFeatureExistence(ProductFeature feature, FinancialProduct financialProduct, bool shouldExist, DateTime today)
        {
            ProductFeatureApplicability current = GetActive(feature, financialProduct);
            //no changes
            if (shouldExist && current != null)
                return current;

            if (shouldExist && current == null)
            {
                ProductFeatureApplicability applicability = new ProductFeatureApplicability();
                applicability.FinancialProduct = financialProduct;
                applicability.EffectiveDate = today;
                applicability.ProductFeature = feature;

                Context.ProductFeatureApplicabilities.AddObject(applicability);
                return applicability;
            }

            if (current != null && shouldExist == false)
            {
                current.EndDate = today;
                return current;
            }

            return null;
        }
 public static IEnumerable<ProductFeatureApplicability> GetAllActive(ProductFeature feature, FinancialProduct financialProduct)
 {
     return financialProduct.ProductFeatureApplicabilities.Where(entity => entity.EndDate == null && entity.ProductFeatureId == feature.Id);
 }
 public static ProductFeatureApplicability GetActive(ProductFeature feature, FinancialProduct financialProduct)
 {
     return financialProduct.ProductFeatureApplicabilities.FirstOrDefault(entity => entity.EndDate == null && entity.ProductFeatureId == feature.Id);
 }