public EmployeeBenefitDTO(EmployeeBenefit employeeBenefit, bool deepCopy)
        {
            this.employeeBenefitId = employeeBenefit.EmployeeBenefitId;
            this.employeeId = employeeBenefit.EmployeeId;
            this.benefitId = employeeBenefit.BenefitId;
            this.createdDate = employeeBenefit.CreatedDate.ToJavaScriptDate();
            this.discountApplied = employeeBenefit.Employee.EmployeeDiscounts.Any(ed => ed.BenefitDiscount.Benefit.BenefitId == employeeBenefit.BenefitId);
            this.isActive = employeeBenefit.IsActive;
            this.isDeleted = employeeBenefit.IsDeleted;

            // Only deep copy these if we have a specific need to.
            // These items will not deep copy their child items.
            if (deepCopy)
            {
                this.employee = new EmployeeDTO(employeeBenefit.Employee, false);
                this.benefit = CheckDiscounts(employeeBenefit);
            }
        }
        private BenefitDTO CheckDiscounts(EmployeeBenefit employeeBenefit, EmployeeDependent dependent)
        {
            // Create the DTO
            BenefitDTO benefit = new BenefitDTO(employeeBenefit.Benefit, false);

            // Check to see if there is a discount for this benefit.
            EmployeeDiscount discount = dependent.EmployeeDiscounts.Where(ed => ed.BenefitDiscount.Benefit.BenefitId == employeeBenefit.BenefitId).FirstOrDefault();

            // If there is...
            if (discount != null)
            {
                // Is the discount a percentage?
                if (discount.BenefitDiscount.Percent > 0)
                {
                    benefit.benefitCostDependent = benefit.benefitCostDependent * ((100 - (decimal)discount.BenefitDiscount.Percent.Value) / 100);
                }

                // Or is it an amount?
                else if (discount.BenefitDiscount.Amount > 0)
                {
                    benefit.benefitCostDependent -= discount.BenefitDiscount.Amount.Value;
                }
            }

            // Return the DTO.
            return benefit;
        }
        public static void Initialize(BenefitsDataContext db)
        {
            if (db.Database.ProviderName != "Microsoft.EntityFrameworkCore.InMemory")
            {
                db.Database.Migrate();
            }

            if (db.Employees.Any())
            {
                return;
            }

            var employeeBenefit = new EmployeeBenefit()
            {
                AnnualCost = 1000, IsEnabled = true, Description = "Medical benefit for household",
            };

            employeeBenefit.BenefitDiscounts = new List <BenefitDiscount>()
            {
                new NameStartsWithBenefitDiscount()
                {
                    NameStartsWith = "A",
                    Percent        = 0.01M,
                }
            };
            db.EmployeeBenefits.AddRange(employeeBenefit);

            var dependentBenefit = new DependentBenefit()
            {
                AnnualCost = 500, IsEnabled = true, Description = "Medical benefit for dependents"
            };

            dependentBenefit.BenefitDiscounts = new List <BenefitDiscount>()
            {
                new NameStartsWithBenefitDiscount()
                {
                    NameStartsWith = "A",
                    Percent        = 0.1M,
                }
            };
            db.DependentBenefits.AddRange(dependentBenefit);

            var employee = new Employee()
            {
                FirstName = "John",
                LastName  = "Doe",
                StartDate = new DateTime(2020, 1, 1),

                Dependents = new List <Dependent>()
                {
                    new Dependent()
                    {
                        FirstName = "Jane",
                        LastName  = "Doe",
                        DependentRelationshipToEmployee = DependentRelationshipToEmployee.Spouse,
                    },
                    new Dependent()
                    {
                        FirstName = "Kevin",
                        LastName  = "Doe",
                        DependentRelationshipToEmployee = DependentRelationshipToEmployee.Child,
                    },
                    new Dependent()
                    {
                        FirstName = "Alex",
                        LastName  = "Doe",
                        DependentRelationshipToEmployee = DependentRelationshipToEmployee.Child,
                    }
                }
            };

            employee.Paychecks = BuildPaychecks(employee, 2020);
            db.Employees.AddRange(
                employee
                );
            db.SaveChanges();
        }