public static GebruikerDepartement koppelGebruikerAanDepartement(Gebruiker gebruiker, Departement departement)
 {
     GebruikerDepartement gebruikerDepartement = new GebruikerDepartement(gebruiker, departement);
     gebruiker.GebruikerDepartementen.Add(gebruikerDepartement);
     departement.GebruikerDepartementen.Add(gebruikerDepartement);
     return gebruikerDepartement;
 }        
 public void InsertOrUpdate(Gebruiker gebruiker)
 {
     if (gebruiker.Id == default(int)) {
         // New entity
         context.Gebruikers.Add(gebruiker);
     } else {
         // Existing entity
         context.Entry(gebruiker).State = EntityState.Modified;
     }
 }
 public JsonResult Update(Gebruiker gebruiker)
 {           
     try
     {
         gebruikerService.Update(gebruiker);                
         return Json(new { Result = "OK" });
     }
     catch (Exception ex)
     {
         return Json(new { Result = "ERROR", Message = "Kon gebruiker niet aanpassen: " + ex.Message });
     }
 }
 public JsonResult Create(Gebruiker gebruiker)
 {           
     try
     {
         gebruikerService.Nieuw(gebruiker);
         var jsonGebruiker = new { Id = gebruiker.Id, Achternaam = gebruiker.Achternaam, Voornaam = gebruiker.Voornaam, Rol = gebruiker.Rol, Login = gebruiker.Login };
         return Json(new { Result = "OK", Record = jsonGebruiker });
     }
     catch (Exception ex)
     {
         return Json(new { Result = "ERROR", Message = "Kon geen gebruiker aanmaken: " + ex.Message });
     }
 }
        public void Nieuw(Gebruiker gebruiker)
        {   
            ApplicationUser appUser = new ApplicationUser()
            {                
                UserName = gebruiker.Login       
            };
            uow.IdentityManager.CreateUser(appUser, gebruiker.Login); 

            gebruiker.User = appUser;
            uow.GebruikerRepository.InsertOrUpdate(gebruiker);
            uow.saveChanges();

            uow.IdentityManager.AddUserToRole(appUser.Id, gebruiker.rolString());
            appUser.GebruikerId = gebruiker.Id;
            uow.saveChanges();
        }
        public GebruikerKlantViewModel GebruikerKlantViewModel(Gebruiker gebruiker)
        {
            GebruikerKlantViewModel gkvm = new GebruikerKlantViewModel();

            if(gebruiker != null)
            {
                if (gebruiker.Rol == Rol.ADMINISTRATOR)
                {
                    gkvm.setDepartementen(uow.DepartementRepository.All);
                }
                if (gebruiker.Rol == Rol.DEPARTEMENT_ADMINISTRATOR)
                {
                    gkvm.setDepartementen(gebruiker.Departementen());
                }
            }

            return gkvm;
        }
        public IEnumerable<GebruikerDepartement> alleGebruikerDepartementenVoor(Gebruiker gebruiker, int departementId)
        {
            IEnumerable<GebruikerDepartement> gebruikerDepartementen = new List<GebruikerDepartement>();
            Departement departement = uow.DepartementRepository.Find(departementId);

            if (gebruiker != null && departement != null)
            {
                if (gebruiker.Rol == Rol.ADMINISTRATOR || gebruiker.Rol == Rol.DEPARTEMENT_ADMINISTRATOR)
                {
                    gebruikerDepartementen = departement.GebruikerDepartementen;
                }
                if (gebruiker.Rol == Rol.USER)
                {
                    gebruikerDepartementen = gebruiker.GebruikerDepartementen.Where(gd => gd.Departement.Equals(departement));
                }
            }

            return gebruikerDepartementen;            
        }
        public UurRegistratieViewModel UurRegistratieViewModel(Gebruiker gebruiker, bool gefactureerd)
        {
            UurRegistratieViewModel gkvm = new UurRegistratieViewModel();
            gkvm.Gefactureerd = gefactureerd;

            if (gebruiker != null)
            {
                if (gebruiker.Rol == Rol.ADMINISTRATOR)
                {
                    gkvm.setDepartementen(uow.DepartementRepository.All);
                }
                if (gebruiker.Rol == Rol.DEPARTEMENT_ADMINISTRATOR || gebruiker.Rol == Rol.USER)
                {
                    gkvm.setDepartementen(gebruiker.Departementen());
                }
            }

            return gkvm;
        }
        public KlantViewModel KlantViewModel(Gebruiker gebruiker)
        {
            KlantViewModel kvm = new KlantViewModel();
            kvm.Klant = new Klant(); 

            if (gebruiker != null)
            {
                if (gebruiker.Rol == Rol.ADMINISTRATOR)
                {
                    IEnumerable<Departement> alleDepartementen = uow.DepartementRepository.All;
                    kvm.setDepartementen(alleDepartementen);
                }
                if (gebruiker.Rol == Rol.DEPARTEMENT_ADMINISTRATOR)
                {
                    kvm.setDepartementen(gebruiker.Departementen());
                }
            }

            return kvm;
        }
        public IEnumerable<Klant> AlleKlanten(Gebruiker gebruiker)
        {
            List<Klant> alleKlanten = new List<Klant>();

            if (gebruiker != null)
            {
                if (gebruiker.Rol == Rol.ADMINISTRATOR)
                {
                    alleKlanten = uow.KlantRepository.All.ToList();
                }
                if (gebruiker.Rol == Rol.DEPARTEMENT_ADMINISTRATOR)
                {
                    foreach (Departement dep in gebruiker.Departementen())
                    {
                        alleKlanten.AddRange(dep.Klanten());
                    }
                }
            }

            return alleKlanten;
        }
        public IEnumerable<Departement> AlleMogelijkeDepartementen(Gebruiker gebruiker)
        {
            List<Departement> departementen = new List<Departement>();
            IEnumerable<DepartementKlant> alleDepartementKlanten = uow.DepartementKlantRepository.All;

            if (gebruiker != null)
            {
                if (gebruiker.Rol == Rol.ADMINISTRATOR)
                {
                    departementen.AddRange(alleDepartementKlanten.Select(dk => dk.Departement).Distinct());
                }
                if (gebruiker.Rol == Rol.DEPARTEMENT_ADMINISTRATOR)
                {
                    IEnumerable<Departement> depsVanGebruiker = gebruiker.Departementen();
                    departementen.AddRange(
                        alleDepartementKlanten.Select(dk => dk.Departement)
                                              .Where(d => depsVanGebruiker.Contains(d))
                                              .Distinct());
                }
            }

            return departementen;
        }
 private GebruikerDepartement(Gebruiker gebruiker, Departement departement) {
     Gebruiker = gebruiker;
     GebruikerId = gebruiker.Id;
     Departement = departement;
     DepartementId = departement.Id;
 }
        public void OntkoppelDepartementVanKlant(int departementId, int klantId, Gebruiker gebruiker)
        {
            Klant klant = uow.KlantRepository.Find(klantId);
            Departement departement = uow.DepartementRepository.Find(departementId);

            if (klant == null || departement == null)
            {
                throw new Exception("Klant of departement onbekend");
            }
            if (klant.DepartementKlanten.Count < 2)
            {
                throw new Exception("Een klant moet minstens aan één departement gekoppeld zijn");
            }
            if (gebruiker.Rol == Rol.DEPARTEMENT_ADMINISTRATOR)
            {
                if (!gebruiker.Departementen().Contains(departement))
                {
                    throw new Exception("Als departement administrator kan je enkel klanten ontkoppelen van je eigen departementen");
                }
            }

            DepartementKlant ontkoppeld = klant.OntkoppelVanDepartement(departement);
            uow.DepartementKlantRepository.Delete(ontkoppeld.Id);
            uow.saveChanges();
        }
        public void Delete(int klantId, Gebruiker gebruiker)
        {
            Klant klant = uow.KlantRepository.Find(klantId);
            if (klant == null)
            {
                throw new Exception("Geen klant gevonden");
            }
            if (!klant.Verwijderbaar())
            {
                throw new Exception("De Klant is niet verwijderbaar omdat er al uurregistraties en/of facturen aan gekoppeld zijn");
            }

            List<DepartementKlant> departementKlanten = klant.DepartementKlanten.ToList();
            List<GebruikerKlant> gebruikerKlanten = klant.GebruikerKlanten();

            if (gebruiker.Rol == Rol.DEPARTEMENT_ADMINISTRATOR)
            {
                IEnumerable<Departement> klantDepartementen = departementKlanten.Select(dk => dk.Departement);
                IEnumerable<Departement> gebruikerDepartementen = gebruiker.Departementen();
                if (klantDepartementen.Except(gebruikerDepartementen).Count() > 0)
                {
                    throw new Exception("Als departement administrator kan je geen klanten verwijderen die koppelingen hebben met departementen waar je niet voor bevoegd bent");
                }
            }

            gebruikerKlanten.Select(gk => gk.Id).ToList().ForEach(
                id => uow.GebruikerKlantRepository.Delete(id)
                );

            departementKlanten.Select(dk => dk.Id).ToList().ForEach(
                id => uow.DepartementKlantRepository.Delete(id)
                );

            uow.KlantRepository.Delete(klantId);
            uow.saveChanges();
        }
        public IEnumerable<Departement> MogelijkeDepartementenKlantGebruiker(int klantId, Gebruiker gebruiker)
        {
            Klant klant = uow.KlantRepository.Find(klantId);

            if (klant == null || gebruiker == null)
            {
                throw new Exception("Klant of gebruiker onbekend");
            }

            IEnumerable<Departement> result = null;

            IEnumerable<Departement> alleDepartementen = uow.DepartementRepository.All;
            IEnumerable<Departement> klantDepartementen = klant.Departementen();

            if (gebruiker.Rol == Rol.ADMINISTRATOR)
            {
                result = alleDepartementen.Except(klantDepartementen);
            }
            if (gebruiker.Rol == Rol.DEPARTEMENT_ADMINISTRATOR)
            {
                IEnumerable<Departement> gebruikerDepartementen = gebruiker.Departementen();
                result = gebruikerDepartementen.Except(klantDepartementen);
            }

            return result;
        }
        public void Update(Gebruiker gebruiker)
        {
            // Login mag niet geüpdatet worden waardoor de Login property van het argument gebruiker 'null' is
            // => Eerst oude Login waarde terug zetten
            Gebruiker oud = uow.Context.Gebruikers.AsNoTracking().Single(g => g.Id == gebruiker.Id);
            gebruiker.Login = oud.Login;               

            uow.GebruikerRepository.InsertOrUpdate(gebruiker);

            ApplicationUser appUser = null;
            try {
                appUser = uow.Context.Users.Single(u => u.GebruikerId == gebruiker.Id);
            } catch (Exception ex)
            {
                throw new Exception(String.Format("Fout met relatie Gebruiker - User: {0}", ex.Message));
            }

            if (appUser != null)
            {
                uow.IdentityManager.ClearUserRoles(appUser.Id);
                uow.IdentityManager.AddUserToRole(appUser.Id, gebruiker.rolString());
            }

            uow.saveChanges();
        }