public string AddMovement(string data)
        {
            try
            {
                var movement = JsonConvert.DeserializeObject<NewMovement>(data);
                var en = new HaushaltsrechnerEntities();

                var acc = en.ACCOUNT.FirstOrDefault(a=>a.ID == movement.AccountID);
                var cat = en.CATEGORY.FirstOrDefault(c=>c.ID == movement.CategoryID);
                var user = en.USER.FirstOrDefault(u => u.ID == SessionManager.CurrentUser.ID);
                var rea = en.REASON.Where(r => r.TEXT == movement.Reason);

                REASON reason;
                if (rea.Any())
                {
                    reason = rea.First();
                }
                else
                {
                    reason = new REASON
                    {
                        ID = Guid.NewGuid(),
                        TEXT = movement.Reason
                    };
                    en.REASON.AddObject(reason);
                }

                var m = new MOVEMENT
                {
                    ID = movement.ID,
                    DATE_ADDED = movement.DateAdded,
                    DATE_EDIT = DateTime.Now,
                    AMOUNT = Decimal.Parse(movement.Amount.Replace("€",string.Empty)),
                    MESSAGE = movement.Message,
                    USER = user,
                    ACCOUNT = acc,
                    CATEGORY = cat,
                    REASON = reason
                };

                en.MOVEMENT.AddObject(m);
                en.SaveChanges();
                return bool.TrueString;
            }
            catch
            {
                return bool.FalseString;
            }
        }
        /// <summary>
        /// Deletes the <see cref="HaushaltsRechner.Data.Model.MOVEMENT"/>.
        /// </summary>
        /// <param name="id">The id.</param>
        /// <returns><c>true</c>, if deletion successfull</returns>
        public static bool DeleteMovement(Guid id)
        {
            if (id == Guid.Empty)
            {
                return false;
            }

            using (var en = new HaushaltsrechnerEntities())
            {
                var m = en.MOVEMENT.FirstOrDefault(mo => mo.ID == id);

                if (m == null)
                {
                    return false;
                }

                en.MOVEMENT.DeleteObject(m);
                en.SaveChanges();
                return true;
            }
        }
        /// <summary>
        /// Adds a <see cref="HaushaltsRechner.Data.Model.USER"/>.
        /// </summary>
        /// <param name="name">The name.</param>
        /// <param name="pw">The password.</param>
        /// <param name="sysAdmin">if set to <c>true</c> System Admin flag will be set.</param>
        /// <returns><c>true</c>, if addition successfull</returns>
        public static bool AddUser(string name, string pw, bool sysAdmin)
        {
            if (name == string.Empty)
            {
                return false;
            }

            using (var en = new HaushaltsrechnerEntities())
            {
                var pass = string.Empty;

                var testUser = en.USER.FirstOrDefault(u => u.NAME == name);

                if (testUser != null)
                {
                    return false;
                }

                if (pw != string.Empty)
                {
                    byte[] encrypted = Cryptography.EncryptStringToBytes_AES(pw);

                    foreach (var e in encrypted)
                    {
                        pass += (char)e;
                    }
                }

                var user = new USER
                {
                    NAME = name,
                    PASSWORT = pass,
                    ISADMIN = sysAdmin,
                    ID = Guid.NewGuid()
                };
                en.USER.AddObject(user);
                en.SaveChanges();
                return true;
            }
        }
        /// <summary>
        /// Creates the <see cref="HaushaltsRechner.Data.Model.REASON"/>.
        /// </summary>
        /// <param name="text">The text.</param>
        /// <returns>
        /// The new <see cref="HaushaltsRechner.Data.Model.REASON"/>, 
        /// or if Text already exists,the old <see cref="HaushaltsRechner.Data.Model.REASON"/>
        /// </returns>
        public static REASON CreateReason(string text)
        {
            using (var en = new HaushaltsrechnerEntities())
            {
                var rOld = en.REASON.Where(r => r.TEXT == text);

                if (!rOld.Any())
                {
                    var r = new REASON
                    {
                        ID = Guid.NewGuid(),
                        TEXT = text
                    };

                    en.REASON.AddObject(r);
                    en.SaveChanges();

                    return r;
                }

                return rOld.First();
            }
        }
        /// <summary>
        /// Adds an <see cref="HaushaltsRechner.Data.Model.ACCOUNT"/>.
        /// </summary>
        /// <param name="name">The new name.</param>
        /// <returns><c>false</c>, if <see cref="HaushaltsRechner.Data.Model.ACCOUNT"/> already exists</returns>
        public static bool AddAccount(string name)
        {
            using (var en = new HaushaltsrechnerEntities())
            {
                var aOld = en.ACCOUNT.FirstOrDefault(r => r.NAME == name);

                if (aOld == null)
                {
                    var a = new ACCOUNT
                    {
                        ID = Guid.NewGuid(),
                        NAME = name
                    };

                    en.ACCOUNT.AddObject(a);
                    en.SaveChanges();

                    return true;
                }

                return false;
            }
        }
        /// <summary>
        /// Adds an <see cref="HaushaltsRechner.Data.Model.CATEGORY"/>.
        /// </summary>
        /// <param name="name">The name.</param>
        /// <returns><c>true</c>, if addition successfull</returns>
        public static bool AddCategory(string name)
        {
            using (var en = new HaushaltsrechnerEntities())
            {
                var cOld = en.CATEGORY.FirstOrDefault(cat => cat.NAME == name);

                if (cOld == null)
                {
                    var c = new CATEGORY
                    {
                        ID = Guid.NewGuid(),
                        NAME = name
                    };

                    en.CATEGORY.AddObject(c);
                    en.SaveChanges();

                    return true;
                }

                return false;
            }
        }
        /// <summary>
        /// Deletes an <see cref="HaushaltsRechner.Data.Model.ACCOUNT"/>.
        /// </summary>
        /// <param name="id">The id.</param>
        /// <returns><c>true</c>, if deletion successfull</returns>
        public static bool DeleteAccount(Guid id)
        {
            using (var en = new HaushaltsrechnerEntities())
            {
                var acc = en.ACCOUNT.FirstOrDefault(a => a.ID == id);
                if (acc == null)
                {
                    return false;
                }

                acc.USER.Clear();

                var movements = acc.MOVEMENT.ToList();
                acc.MOVEMENT.Clear();
                foreach (var m in movements)
                {
                    en.MOVEMENT.DeleteObject(m);
                }

                en.ACCOUNT.DeleteObject(acc);
                en.SaveChanges();

                return true;
            }
        }
        /// <summary>
        /// Gets all <see cref="HaushaltsRechner.Data.Model.MOVEMENT"/>
        /// </summary>
        /// <returns></returns>
        public static IQueryable<MOVEMENT> GetAllMovements()
        {
            var en = new HaushaltsrechnerEntities();

            return en.MOVEMENT;
        }
 public string GetAllValidAccounts()
 {
     using (var en = new HaushaltsrechnerEntities())
     {
         var userID = SessionManager.CurrentUser.ID;
         var accs = en.ACCOUNT.Where(a => a.USER.Any(u=>u.ID == userID))
             .Select(a=>
                 new NameAsString
                 {
                     ID = a.ID,
                     Name = a.NAME
                 })
             .ToList();
         return JsonConvert.SerializeObject(accs);
     }
 }
        public string GetAccountUsers(string data)
        {
            if (!RightsManager.HasRight(SessionManager.CurrentUser.ID, Feature.AdminAccount))
            {
                return bool.FalseString;
            }

            try
            {
                var id = JsonConvert.DeserializeObject<Guid>(data);
                var accountUser = new List<AccountUser>();

                using (var en = new HaushaltsrechnerEntities())
                {
                    var account = en.ACCOUNT.FirstOrDefault(a => a.ID == id);
                    if (account == null)
                    {
                        return bool.FalseString;
                    }

                    foreach (var u in en.USER)
                    {
                        accountUser.Add(new AccountUser
                            {
                                ID = u.ID,
                                Name = u.NAME,
                                InAccount = account.USER.Contains(u)
                            });
                    }

                    return JsonConvert.SerializeObject(accountUser);
                }
            }
            catch
            {
            }

            return bool.FalseString;
        }
        /// <summary>
        /// Gets the <see cref="HaushaltsRechner.Data.Model.MOVEMENT"/> by <see cref="HaushaltsRechner.Business.SearchParameter.MovementSearchParameter"/>.
        /// </summary>
        /// <param name="para">The searchparameter.</param>
        /// <param name="currUserID">The ID of the <see cref="HaushaltsRechner.Data.Model.USER"/> who's searching</param>
        /// <returns>List of <see cref="HaushaltsRechner.Data.Model.MOVEMENT"/></returns>
        public static IQueryable<MOVEMENT> GetMovementsBySearchparameter(MovementSearchParameter para, Guid currUserID)
        {
            var en = new HaushaltsrechnerEntities();

            var query = from m in en.MOVEMENT
                            select m;

            var accIds = AccountManager.GetAccountsByUserId(currUserID).Select(a => a.ID);
            query = query.Where(m => accIds.Contains(m.ACCOUNT_ID));

            if (para.ValueFrom != decimal.MinValue)
            {
                query = query.Where(m => m.AMOUNT >= para.ValueFrom);
            }

            if (para.ValueTo != decimal.MinValue)
            {
                query = query.Where(m => m.AMOUNT <= para.ValueTo);
            }

            if (para.DateFrom != DateTime.MinValue)
            {
                query = query.Where(m => m.DATE_ADDED >= para.DateFrom);
            }

            if (para.DateTo != DateTime.MinValue)
            {
                query = query.Where(m => m.DATE_ADDED <= para.DateTo);
            }

            if (para.EditFrom != DateTime.MinValue)
            {
                query = query.Where(m => m.DATE_EDIT >= para.EditFrom);
            }

            if (para.EditTo != DateTime.MinValue)
            {
                query = query.Where(m => m.DATE_EDIT <= para.EditTo);
            }

            if (para.UserID != Guid.Empty)
            {
                query = query.Where(m => m.USER_ID == para.UserID);
            }

            if (para.AccountID != Guid.Empty)
            {
                query = query.Where(m => m.ACCOUNT_ID == para.AccountID);
            }

            if (para.ReasonID != Guid.Empty)
            {
                query = query.Where(m => m.REASON_ID == para.ReasonID);
            }

            query = query.OrderBy(m => m.DATE_ADDED);

            return query;
        }
        /// <summary>
        /// Gets all <see cref="HaushaltsRechner.Data.Model.CATEGORY"/>.
        /// </summary>
        /// <returns>all <see cref="CATEGORY"/>s</returns>
        public static IQueryable<CATEGORY> GetAllCategories()
        {
            var en = new HaushaltsrechnerEntities();

            return en.CATEGORY;
        }
 /// <summary>
 /// Get an account by its ID
 /// </summary>
 /// <param name="id">ID of the <see cref="HaushaltsRechner.Data.Model.ACCOUNT"/></param>
 /// <returns>
 /// <see cref="HaushaltsRechner.Data.Model.ACCOUNT"/> to the ID or null, if no 
 /// <see cref="HaushaltsRechner.Data.Model.ACCOUNT"/> was found. 
 /// </returns>
 public static ACCOUNT GetAccountById(Guid id)
 {
     using (var en = new HaushaltsrechnerEntities())
     {
         return en.ACCOUNT.FirstOrDefault(a => a.ID == id);
     }
 }
 /// <summary>
 /// Gets the <see cref="HaushaltsRechner.Data.Model.USER"/> by name.
 /// </summary>
 /// <param name="name">The name.</param>
 /// <returns><see cref="HaushaltsRechner.Data.Model.USER"/> or null</returns>
 public static USER GetUserByName(string name)
 {
     using (var en = new HaushaltsrechnerEntities())
     {
         return en.USER.FirstOrDefault(u => u.NAME == name);
     }
 }
        /// <summary>
        /// Edits an <see cref="HaushaltsRechner.Data.Model.ACCOUNT"/>.
        /// </summary>
        /// <param name="id">The id.</param>
        /// <param name="newName">The new name.</param>
        /// <returns><c>true</c>, if edition successfull </returns>
        public static bool EditAccount(Guid id, string newName)
        {
            using (var en = new HaushaltsrechnerEntities())
            {
                var acc = en.ACCOUNT.FirstOrDefault(a=>a.ID == id);
                if(acc == null || string.IsNullOrEmpty(newName))
                {
                    return false;
                }

                acc.NAME = newName;
                en.SaveChanges();

                return true;
            }
        }
 /// <summary>
 /// Gets the <see cref="HaushaltsRechner.Data.Model.USER"/> by id.
 /// </summary>
 /// <param name="id">The ID.</param>
 /// <returns><see cref="HaushaltsRechner.Data.Model.USER"/> or null</returns>
 public static USER GetUserById(Guid id)
 {
     using (var en = new HaushaltsrechnerEntities())
     {
         return en.USER.FirstOrDefault(u => u.ID == id);
     }
 }
        /// <summary>
        /// Gets all <see cref="HaushaltsRechner.Data.Model.USER"/>s.
        /// </summary>
        /// <returns>All <see cref="HaushaltsRechner.Data.Model.USER"/>s</returns>
        public static IQueryable<USER> GetAllUser()
        {
            var en = new HaushaltsrechnerEntities();

            return en.USER;
        }
        /// <summary>
        /// Edit a <see cref="HaushaltsRechner.Data.Model.USER" />.
        /// </summary>
        /// <param name="id">The id.</param>
        /// <param name="name">The new name.</param>
        /// <param name="pw">The new password.</param>
        /// <param name="lang">The language.</param>
        /// <param name="sysAdmin">new sys admin.</param>
        /// <returns>
        ///   <c>true</c>, if edition successfull
        /// </returns>
        public static bool EditUser(Guid id, string name, string pw, string lang, bool? sysAdmin)
        {
            if (id == Guid.Empty || name == string.Empty)
            {
                return false;
            }

            using (var en = new HaushaltsrechnerEntities())
            {
                var testUser = en.USER.FirstOrDefault(u => u.NAME == name && u.ID != id);

                if (testUser != null)
                {
                    return false;
                }

                var user = en.USER.FirstOrDefault(u => u.ID == id);

                if (user == null)
                {
                    return false;
                }

                if (!string.IsNullOrEmpty(pw))
                {
                    var pass = string.Empty;
                    byte[] encrypted = Cryptography.EncryptStringToBytes_AES(pw);

                    foreach (var e in encrypted)
                    {
                        pass += (char)e;
                    }

                    user.PASSWORT = pass;
                }

                try
                {
                    var culture = CultureInfo.CreateSpecificCulture(lang);
                    user.CULTURE = culture.Name;
                }
                catch
                {
                }

                user.NAME = name;
                user.ISADMIN = sysAdmin.HasValue ? sysAdmin.Value : user.ISADMIN;

                en.SaveChanges();
                return true;
            }
        }
        /// <summary>
        /// Deletes a <see cref="HaushaltsRechner.Data.Model.USER"/>.
        /// </summary>
        /// <param name="id">The id.</param>
        /// <returns><c>true</c>, if deletion sucessfull</returns>
        public static bool DeleteUser(Guid id)
        {
            using (var en = new HaushaltsrechnerEntities())
            {
                var user = en.USER.FirstOrDefault(u => u.ID == id);
                if (user == null)
                {
                    return false;
                }

                user.RIGHT.Clear();

                var mov = en.MOVEMENT.Where(m => m.USER_ID == id);
                foreach (var m in mov)
                {
                    m.USER = null;
                }

                var acc = en.ACCOUNT.Where(a => a.USER.Any(u => u.ID == id));
                foreach (var a in acc)
                {
                    a.USER.Remove(user);
                }

                en.USER.DeleteObject(user);
                en.SaveChanges();
            }
            return true;
        }
 /// <summary>
 /// Gets the <see cref="HaushaltsRechner.Data.Model.MOVEMENT"/> by id.
 /// </summary>
 /// <param name="id">The id.</param>
 /// <returns><see cref="HaushaltsRechner.Data.Model.MOVEMENT"/> or null</returns>
 public static MOVEMENT GetMovementById(Guid id)
 {
     using (var en = new HaushaltsrechnerEntities())
     {
         return en.MOVEMENT.FirstOrDefault(m => m.ID == id);
     }
 }
        /// <summary>
        /// Edits an <see cref="ACCOUNT"/> user.
        /// </summary>
        /// <param name="accId">The <see cref="HaushaltsRechner.Data.Model.ACCOUNT"/> id.</param>
        /// <param name="userId">The <see cref="HaushaltsRechner.Data.Model.USER"/> id.</param>
        /// <param name="set">
        /// if set to <c>true</c>,
        /// <see cref="HaushaltsRechner.Data.Model.USER"/> will be added to <see cref="HaushaltsRechner.Data.Model.ACCOUNT"/>
        /// </param>
        /// <returns><c>true</c>, if edition successfull</returns>
        public static bool EditAccountUsers(Guid accId, Guid userId, bool set)
        {
            using (var en = new HaushaltsrechnerEntities())
            {
                var acc = en.ACCOUNT.FirstOrDefault(a => a.ID == accId);
                if (acc == null || userId == Guid.Empty)
                {
                    return false;
                }

                var user = en.USER.FirstOrDefault(u => u.ID == userId);
                if (user == null)
                {
                    return false;
                }

                if (set && !acc.USER.Contains(user))
                {
                    acc.USER.Add(user);
                }
                else if (!set && acc.USER.Contains(user))
                {
                    acc.USER.Remove(user);
                }

                en.SaveChanges();

                return true;
            }
        }
        /// <summary>
        /// Determines whether the specified <see cref="USER"/> has right to use a <see cref="Feature"/>.
        /// </summary>
        /// <param name="userID">The user ID.</param>
        /// <param name="feat">The <see cref="Feature"/> to check.</param>
        /// <returns>
        ///   <c>true</c> if the specified <see cref="USER"/> has right; otherwise, <c>false</c>.
        /// </returns>
        public static bool HasRight(Guid userID, Feature feat)
        {
            var featName = feat.ToString();
            using(var en = new HaushaltsrechnerEntities())
            {
                var right = en.RIGHT.FirstOrDefault(r => r.NAME == featName);
                var user = en.USER.FirstOrDefault(u=>u.ID == userID);

                return (right != null && user != null)
                    ? HasRight(user, right)
                    : false;
            }
        }
 /// <summary>
 /// Returns all <see cref="HaushaltsRechner.Data.Model.ACCOUNT"/>s, the <see cref="HaushaltsRechner.Data.Model.USER"/> contains
 /// </summary>
 /// <param name="id">ID of the <see cref="HaushaltsRechner.Data.Model.USER"/></param>
 /// <returns>List of <see cref="ACCOUNT"/></returns>
 public static List<ACCOUNT> GetAccountsByUserId(Guid id)
 {
     using (var en = new HaushaltsrechnerEntities())
     {
         return en.ACCOUNT.Where(a => a.USER.Any(u => u.ID == id)).ToList();
     }
 }
        /// <summary>
        /// Sets the <see cref="RIGHT"/> for a <see cref="USER"/>.
        /// </summary>
        /// <param name="userID">The user ID.</param>
        /// <param name="rightID">The right ID.</param>
        /// <param name="set">
        /// if set to <c>true</c> set <see cref="RIGHT"/>.
        /// if set to <c>false</c> remove <see cref="RIGHT"/></param>
        /// <returns></returns>
        public static bool SetRight(Guid userID, Guid rightID, bool set)
        {
            using (var en = new HaushaltsrechnerEntities())
            {
                var user = en.USER.FirstOrDefault(u => u.ID == userID);
                var right = en.RIGHT.FirstOrDefault(r => r.ID == rightID);

                if (user == null || right == null)
                {
                    return false;
                }

                if (set)
                {
                    if (!user.RIGHT.Contains(right))
                    {
                        user.RIGHT.Add(right);
                    }
                }
                else
                {
                    if (user.RIGHT.Contains(right))
                    {
                        user.RIGHT.Remove(right);
                    }
                }
                en.SaveChanges();
            }

            return true;
        }
        /// <summary>
        /// Creates an <see cref="HaushaltsRechner.Data.Model.ACCOUNT"/> with the specified name and one 
        /// <see cref="HaushaltsRechner.Data.Model.USER"/>
        /// </summary>
        /// <param name="name">Name of the new <see cref="HaushaltsRechner.Data.Model.ACCOUNT"/></param>
        /// <param name="userId">ID of the first <see cref="HaushaltsRechner.Data.Model.USER"/>
        /// of the <see cref="HaushaltsRechner.Data.Model.ACCOUNT"/></param>
        /// <returns>
        /// The created <see cref="HaushaltsRechner.Data.Model.ACCOUNT"/>
        /// or an old <see cref="HaushaltsRechner.Data.Model.ACCOUNT"/>, if Name is already in DB
        /// </returns>
        public static ACCOUNT CreateAccount(string name, Guid userId)
        {
            using (var en = new HaushaltsrechnerEntities())
            {
                var user = en.USER.FirstOrDefault(u => u.ID == userId);
                var aOld = en.ACCOUNT.First(r => r.NAME == name && r.USER.Any(u => u.ID == user.ID));

                if (aOld == null)
                {
                    var a = new ACCOUNT
                    {
                        ID = Guid.NewGuid(),
                        NAME = name
                    };

                    a.USER.Add(user);
                    en.ACCOUNT.AddObject(a);
                    en.SaveChanges();

                    return a;
                }

                return aOld;
            }
        }
        private static bool HasRight(USER user, RIGHT right)
        {
            if (user.ISADMIN.HasValue && user.ISADMIN.Value)
            {
                return true;
            }

            var uId = user.ID;
            var rId = right.ID;

            using (var en = new HaushaltsrechnerEntities())
            {
                return en.USER.Any(u => u.ID == uId && u.RIGHT.Any(r => r.ID == rId));
            }
        }
 /// <summary>
 /// Gets the <see cref="HaushaltsRechner.Data.Model.CATEGORY"/> by ID.
 /// </summary>
 /// <param name="id">The id.</param>
 /// <returns><see cref="HaushaltsRechner.Data.Model.CATEGORY"/> or null, if no <see cref="HaushaltsRechner.Data.Model.CATEGORY"/> with this ID</returns>
 public static CATEGORY GetCategoryByID(Guid id)
 {
     using (var en = new HaushaltsrechnerEntities())
     {
         return en.CATEGORY.FirstOrDefault(c => c.ID == id);
     }
 }
 /// <summary>
 /// Gets all rights.
 /// </summary>
 /// <returns>List of all <see cref="RIGHT"/></returns>
 public static List<RIGHT> GetRights()
 {
     using (var en = new HaushaltsrechnerEntities())
     {
         return en.RIGHT.ToList();
     }
 }
        /// <summary>
        /// Edits an <see cref="HaushaltsRechner.Data.Model.CATEGORY"/>.
        /// </summary>
        /// <param name="id">The id.</param>
        /// <param name="newName">The new name.</param>
        /// <returns><c>true</c>, if edition successfull</returns>
        public static bool EditCategory(Guid id, string newName)
        {
            using (var en = new HaushaltsrechnerEntities())
            {
                var cat = en.CATEGORY.FirstOrDefault(a => a.ID == id);
                if (cat == null || newName == null || newName == string.Empty)
                {
                    return false;
                }

                cat.NAME = newName;
                en.SaveChanges();

                return true;
            }
        }
        /// <summary>
        /// Gets the <see cref="RIGHT"/>s for a <see cref="USER"/>
        /// </summary>
        /// <param name="userID">The user ID.</param>
        /// <returns></returns>
        public static List<RIGHT> GetRights(Guid userID)
        {
            using (var en = new HaushaltsrechnerEntities())
            {
                var user = en.USER.FirstOrDefault(u => u.ID == userID);

                if (user != null)
                {
                    return user.RIGHT.ToList();
                }
                return null;
            }
        }