public User CreateCopy(User user)
 {
     return new User()
     {
         AccessProfileIds = user.AccessProfileIds.ToList(),
         AccessProfileIdsUnevenWeeks = user.AccessProfileIdsUnevenWeeks.ToList(),
         Id = user.Id,
         IsLocked = user.IsLocked,
         Name = user.Name,
         NfcTag = user.NfcTag,
         Password = user.Password,
         PasswordClear = user.PasswordClear,
         SurName = user.SurName,
         IsShiftWorker = user.IsShiftWorker
     };
 }
        public UserViewModel(User user)
        {
            this.Model = user;
            AccessProfileIds.CollectionChanged += AccessProfileIdsOnCollectionChanged;
            _dirtyFlag = new DirtyState();
            _dirtyFlag.SetComparer(() => DirtyStateBuilder.BuildComparisonString(this.Name,
                                                                                 this.SurName,
                                                                                 this.Password,
                                                                                 this.NfcTag,
                                                                                 this.IsLocked,
                                                                                 this.IsShiftWorker,
                                                                                 DirtyStateBuilder.BuildComparisonString(this.AccessProfileIds.Select(x => x.Model.Id).ToList()),
                                                                                 DirtyStateBuilder.BuildComparisonString(this.AccessProfileIdsUnevenWeeks.Select(x => x.Model.Id).ToList())));

            _nfcTagService.NfcTagCollectionChanged += (sender, args) =>
            {
                this._availableNfcTags = null;
                RaisePropertyChanged("AvailableNfcTags");
                RaisePropertyChanged("IsNfcTagAvailable");
            };
        }
        public void SaveUserCreateNewTest()
        {
            var dataSource = new NFCAccessControlDataSources.XMLDataSource.XmlDataSource();

            var user = new User();

            user.Name = "asdasdasd";
            user.NfcTag = "asdaasdgwesfasdfa";
            user.IsLocked = true;
            user.PasswordClear = "asdawdjafgn";
            user.SurName = "wqeqweqweqwe";

            dataSource.SaveUser(user);
        }
        public User CreateUser()
        {
            var user = new User();
            user.AccessProfileIds = new List<string>();
            user.AccessProfileIdsUnevenWeeks = new List<string>();
            user.Id = Guid.NewGuid().ToString();
            user.Name = String.Empty;
            user.NfcTag = String.Empty;
            user.IsLocked = false;
            user.SurName = String.Empty;
            user.IsShiftWorker = false;

            return user;
        }
 public void RemoveUser(User user)
 {
     try
     {
         _nfcTagService.LockNfcTag(user.NfcTag);
     }
     catch (Exception e)
     {
         //todo: Logging here
         throw new Exception("Error during removal of the user.", e);
     }
     lock (_lock)
     {
         this._dataService.GetDataSource().DeleteUser(user);
         CollectionChanged();
     }
 }
        public bool HasCurrentlyAccess(User user)
        {
            // Chek if User is locked
            if (user.IsLocked)
                return false;

            var nfctag = _nfcTagService.GetNfcTag(user.NfcTag);

            // Check if assigned NFC Tag is locked
            if (nfctag == null || nfctag.IsLocked)
                return false;

            DateTime currently = DateTime.Now;

            if (user.IsShiftWorker)
            {
                DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo;
                Calendar cal = dfi.Calendar;
                int calenderWeek = cal.GetWeekOfYear(currently, dfi.CalendarWeekRule, dfi.FirstDayOfWeek);

                if (calenderWeek%2 != 0)
                {
                    // UNEVEN WEEKS ONLY
                    foreach (var accessProfileIdUnevenWeek in user.AccessProfileIdsUnevenWeeks)
                    {
                        var profile = _accessProfileService.GetAccessProfile(accessProfileIdUnevenWeek);
                        if (profile == null || DateTime.Compare(profile.ValidTill, currently) < 0)
                            continue;
                        // Access Profile Is Currently Valid
                        foreach (var lockDay in profile.LockDays)
                        {
                            if (DateTime.Compare(currently, lockDay.StartTime) >= 0 &&
                                DateTime.Compare(currently, lockDay.EndTime) <= 0)
                                continue;
                        }
                        // currently not in any lockday range

                        WeekDay currentDayAccessRules = null;

                        switch (currently.DayOfWeek)
                        {
                            case DayOfWeek.Monday:
                                currentDayAccessRules = profile.MondayAccess;
                                break;
                            case DayOfWeek.Tuesday:
                                currentDayAccessRules = profile.TuesdayAccess;
                                break;
                            case DayOfWeek.Wednesday:
                                currentDayAccessRules = profile.WednesdayAccess;
                                break;
                            case DayOfWeek.Thursday:
                                currentDayAccessRules = profile.ThursdayAccess;
                                break;
                            case DayOfWeek.Friday:
                                currentDayAccessRules = profile.FridayAccess;
                                break;
                            case DayOfWeek.Saturday:
                                currentDayAccessRules = profile.SaturdayAccess;
                                break;
                            case DayOfWeek.Sunday:
                                currentDayAccessRules = profile.SundayAccess;
                                break;
                        }
                        // Has Access in case current hour is within the given timeframe
                        if (currentDayAccessRules != null &&
                            currentDayAccessRules.IsActive &&
                            currently.Hour > currentDayAccessRules.StartTime &&
                            currently.Hour < currentDayAccessRules.EndTime)
                            return true;
                    }
                    return false;
                }
            }
            // EVEN WEEKS ONLY
            foreach (var accessProfileId in user.AccessProfileIds)
            {
                var profile = _accessProfileService.GetAccessProfile(accessProfileId);
                if (profile == null || DateTime.Compare(profile.ValidTill, currently) < 0)
                    continue;

                var isLocked = false;
                // Access Profile Is Currently Valid
                foreach (var lockDay in profile.LockDays)
                {
                    if (DateTime.Compare(currently, lockDay.StartTime) >= 0 &&
                        DateTime.Compare(currently, lockDay.EndTime) <= 0)
                        isLocked = true;
                }
                // AccessProfile is Currently locked due to lockdays
                if (isLocked)
                    continue;

                // currently not in any lockday range

                WeekDay currentDayAccessRules = null;

                switch (currently.DayOfWeek)
                {
                    case DayOfWeek.Monday:
                        currentDayAccessRules = profile.MondayAccess;
                        break;
                    case DayOfWeek.Tuesday:
                        currentDayAccessRules = profile.TuesdayAccess;
                        break;
                    case DayOfWeek.Wednesday:
                        currentDayAccessRules = profile.WednesdayAccess;
                        break;
                    case DayOfWeek.Thursday:
                        currentDayAccessRules = profile.ThursdayAccess;
                        break;
                    case DayOfWeek.Friday:
                        currentDayAccessRules = profile.FridayAccess;
                        break;
                    case DayOfWeek.Saturday:
                        currentDayAccessRules = profile.SaturdayAccess;
                        break;
                    case DayOfWeek.Sunday:
                        currentDayAccessRules = profile.SundayAccess;
                        break;
                }
                // Has Access in case current hour is within the given timeframe
                if (currentDayAccessRules != null &&
                    currentDayAccessRules.IsActive &&
                    currently.Hour > currentDayAccessRules.StartTime &&
                    currently.Hour < currentDayAccessRules.EndTime)
                    return true;
            }

            return false;
        }
        public void EditUser(User user)
        {
            try
            {
                _nfcTagService.AssignNfcTagToUser(user.Id, user.NfcTag);
            }
            catch (Exception e)
            {
                //todo: Logging here
                throw new Exception("Error during the assignment of the selected nfc tag to the user.", e);
            }

            lock (_lock)
            {
                this._dataService.GetDataSource().SaveUser(user);
                CollectionChanged();
            }
        }
        public void DeleteUser(User user)
        {
            if (!Directory.Exists(UserPath))
                throw new DirectoryNotFoundException("The User Directory is not valid.");

            var fileName = ConvertIdToFileName(UserPath, user.Id);

            try
            {
                if (File.Exists(fileName))
                    File.Delete(fileName);
            }
            catch (Exception e)
            {
                throw new Exception("An error occurred during the cleanup of the user file. Please try again.", e);
            }
        }
        public void SaveUser(User user)
        {
            if (!Directory.Exists(UserPath))
                throw new DirectoryNotFoundException("The User Directory is not valid.");

            if (String.IsNullOrEmpty(user.Id))
                user.Id = Guid.NewGuid().ToString();

            var fileName = ConvertIdToFileName(UserPath, user.Id);

            try
            {
                XmlSerializer mySerializer = new XmlSerializer(typeof(User));

                using (StreamWriter myWriter = new StreamWriter(fileName))
                {
                    mySerializer.Serialize(myWriter, user);
                }

                SignXmlFile(fileName);
            }
            catch (Exception e)
            {
                throw new Exception("An error occurred during the save process. Please try again.", e);
            }
        }