public void UpdateSite(Site site)
        {
            //TODO: Make the change to include SiteState Domain Entity to act as decorater to the SiteState Presistance Entity, this will avoid getting the entity from database twice and lead to better results
            Claim.ValidateNotNull(site, nameof(site));
            Claim.ValidateNotNull(site.Id, $"name of {site} ID");
            var dbSite = _dbContext.Site.Find(site.Id);

            if (dbSite == null)
            {
                throw new Exception($"site with {site.Id} not found in database"); //TODO: Create customexceptiom
            }
            dbSite.AddressLine1 = site.Address.AddressLine1;
            dbSite.AddressLine2 = site.Address.AddressLine2;
            dbSite.City         = site.Address.City;
            dbSite.ContactAlternatePhoneNumber = site.ContactDetails.AlternatePhoneNumber;
            dbSite.ContactEmail       = site.ContactDetails.Email;
            dbSite.ContactFirstName   = site.ContactDetails.Name.FirstName;
            dbSite.ContactLastName    = site.ContactDetails.Name.LastName;
            dbSite.ContactPhoneNumber = site.ContactDetails.PhoneNumber;
            dbSite.ContractStartDate  = site.ContractDuration.Start;
            dbSite.ContractEndDate    = site.ContractDuration.End;
            dbSite.CountyCode         = site.CountyCode;
            dbSite.CountyServedCode   = site.CountyServedCode;
            dbSite.Email                = site.Email;
            dbSite.IsWebEnabled         = true;
            dbSite.LastSavedBy          = "TODO";
            dbSite.LastSavedDateTime    = DateTime.UtcNow;
            dbSite.LicencingStatusCode  = site.LicencingStatus.Value;
            dbSite.PhoneNumber          = site.PrimaryPhoneNumber;
            dbSite.SiteFacilityTypeCode = site.SiteFacitlityType.Value.ToString();
            UpdateHolidays(site, dbSite);
            dbSite.SiteName     = site.SiteName;
            dbSite.SiteNumber   = site.SiteNumber;
            dbSite.SiteTypeCode = site.SiteType.Value;
        }
        private void UpdateHolidays(Site site, SiteState dbSiteState)
        {
            var datesToBeRemoved = new List <SiteHolidayState>();

            foreach (var hol in dbSiteState.SiteHoliday)
            {
                if (dbSiteState.SiteHoliday.All(x => x.HolidayDate.Date != hol.HolidayDate.Date))
                {
                    datesToBeRemoved.Add(hol);
                }
            }
            foreach (var removedHol in datesToBeRemoved)
            {
                dbSiteState.SiteHoliday.Remove(removedHol);
                //TODO: Raise an Domain event about the change of holidays or should these be raised by SiteState Aggregate root?
            }

            foreach (var item in site.Holidays)
            {
                var existingHoliday = dbSiteState.SiteHoliday.FirstOrDefault(x => x.HolidayDate.Date == item.HolidayDate.Date);
                if (existingHoliday == null)
                {
                    dbSiteState.SiteHoliday.Add(new SiteHolidayState
                    {
                        Id = GuidHelper.NewSequentialGuid(),
                        CalendarYearDate      = item.HolidayDate.Year.ToString(),
                        HolidayDate           = item.HolidayDate,
                        HolidayName           = item.Name,
                        FirstInsertedById     = "TODO",
                        FirstInsertedDateTime = DateTime.UtcNow,
                        LastSavedById         = "TODO",
                        LastSavedDateTime     = DateTime.UtcNow
                    });
                }
                else
                {
                    existingHoliday.LastSavedDateTime = DateTime.UtcNow;
                    existingHoliday.HolidayName       = item.Name;
                }
            }
        }
        public void UpdateSite(Site site)
        {
            //TODO: Make the change to include SiteState Domain Entity to act as decorater to the SiteState Presistance Entity, this will avoid getting the entity from database twice and lead to better results
            Claim.ValidateNotNull(site, nameof(site));
            Claim.ValidateNotNull(site.Id, $"name of {site} ID");
            var dbSite = _dbContext.Site.Find(site.Id);
            if (dbSite == null)
                throw new Exception($"site with {site.Id} not found in database"); //TODO: Create customexceptiom

            dbSite.AddressLine1 = site.Address.AddressLine1;
            dbSite.AddressLine2 = site.Address.AddressLine2;
            dbSite.City = site.Address.City;
            dbSite.ContactAlternatePhoneNumber = site.ContactDetails.AlternatePhoneNumber;
            dbSite.ContactEmail = site.ContactDetails.Email;
            dbSite.ContactFirstName = site.ContactDetails.Name.FirstName;
            dbSite.ContactLastName = site.ContactDetails.Name.LastName;
            dbSite.ContactPhoneNumber = site.ContactDetails.PhoneNumber;
            dbSite.ContractStartDate = site.ContractDuration.Start;
            dbSite.ContractEndDate = site.ContractDuration.End;
            dbSite.CountyCode = site.CountyCode;
            dbSite.CountyServedCode = site.CountyServedCode;
            dbSite.Email = site.Email;
            dbSite.IsWebEnabled = true;
            dbSite.LastSavedBy = "TODO";
            dbSite.LastSavedDateTime = DateTime.UtcNow;
            dbSite.LicencingStatusCode = site.LicencingStatus.Value;
            dbSite.PhoneNumber = site.PrimaryPhoneNumber;
            dbSite.SiteFacilityTypeCode = site.SiteFacitlityType.Value.ToString();
            UpdateHolidays(site, dbSite);
            dbSite.SiteName = site.SiteName;
            dbSite.SiteNumber = site.SiteNumber;
            dbSite.SiteTypeCode = site.SiteType.Value;
        }
 public void Add(Site site)
 {
     _dbContext.Site.Add(site.DbState);
 }
        private void UpdateHolidays(Site site, SiteState dbSiteState)
        {
            var datesToBeRemoved = new List<SiteHolidayState>();
            foreach (var hol in dbSiteState.SiteHoliday)
            {
                if (dbSiteState.SiteHoliday.All(x => x.HolidayDate.Date != hol.HolidayDate.Date))
                    datesToBeRemoved.Add(hol);
            }
            foreach (var removedHol in datesToBeRemoved)
            {
                dbSiteState.SiteHoliday.Remove(removedHol);
                //TODO: Raise an Domain event about the change of holidays or should these be raised by SiteState Aggregate root?
            }

            foreach(var item in site.Holidays)
            {
                var existingHoliday = dbSiteState.SiteHoliday.FirstOrDefault(x => x.HolidayDate.Date == item.HolidayDate.Date);
                if (existingHoliday == null)
                {
                    dbSiteState.SiteHoliday.Add(new SiteHolidayState
                    {
                        Id = GuidHelper.NewSequentialGuid(),
                        CalendarYearDate = item.HolidayDate.Year.ToString(),
                        HolidayDate = item.HolidayDate,
                        HolidayName = item.Name,
                        FirstInsertedById = "TODO",
                        FirstInsertedDateTime = DateTime.UtcNow,
                        LastSavedById = "TODO",
                        LastSavedDateTime = DateTime.UtcNow
                    });
                }
                else
                {
                    existingHoliday.LastSavedDateTime = DateTime.UtcNow;
                    existingHoliday.HolidayName = item.Name;
                }

            }
        }
 public void Add(Site site)
 {
     _dbContext.Site.Add(site.DbState);
 }