Esempio n. 1
0
 public void Check(AfdelingsJaar g)
 {
     if (g == null || !_autorisatieMgr.IsGav(g.GroepsWerkJaar))
     {
         throw FaultExceptionHelper.GeenGav();
     }
 }
        /// <summary>
        /// Controleer of <paramref name="filter"/> geen zaken probeert op te vragen waarvoor
        /// je geen rechten hebt.
        /// </summary>
        /// <param name="filter">Een lidfilter</param>
        private void SecurityCheck(LidFilter filter)
        {
            // Check security
            // We verwachten minstens 1 van volgende zaken:
            // GroepID, GroepsWerkJaarID, AfdelingID, FunctieID
            // Als je recht hebt op groep, groepswerkjaar, afdeling of functie
            // dan krijg je resultaat. Securitygewijze is dat geen probleem, want
            // alle zoekvoorwaarden worden 'ge-and'.
            // Heb je geen rechten op groep, groepswerjaar, afdeling of functie,
            // dan krijg je een exception (te veel geknoei)

            Groep groep = null;

            if (filter.GroepID != null)
            {
                groep = _groepenRepo.ByID(filter.GroepID.Value);
            }
            else if (filter.GroepsWerkJaarID != null)
            {
                groep = _groepsWerkJarenRepo.ByID(filter.GroepsWerkJaarID.Value, "Groep").Groep;
            }
            else if (filter.AfdelingID != null)
            {
                groep = _afdelingenRepo.ByID(filter.AfdelingID.Value, "Groep").ChiroGroep;
            }
            else if (filter.FunctieID != null)
            {
                groep = _functiesRepo.ByID(filter.FunctieID.Value, "Groep").Groep;
            }

            if (!_autorisatieMgr.IsGav(groep))
            {
                throw FaultExceptionHelper.GeenGav();
            }
        }
Esempio n. 3
0
 public void CheckSuperGav()
 {
     if (!_autorisatieMgr.IsSuperGav())
     {
         throw FaultExceptionHelper.GeenGav();
     }
 }
Esempio n. 4
0
 /// <summary>
 /// Controleert of de aangelogde gebruiker GAV is voor de gegeven <paramref name="functie"/>,
 /// en throwt de GeenGav-FaultException indien niet.
 /// </summary>
 /// <param name="functie">te controleren functie</param>
 public void Check(Functie functie)
 {
     if (functie == null || !(functie.IsNationaal || _autorisatieMgr.IsGav(functie.Groep)))
     {
         throw FaultExceptionHelper.GeenGav();
     }
 }
Esempio n. 5
0
 public void Check(Afdeling g)
 {
     if (g == null || !_autorisatieMgr.IsGav(g.ChiroGroep))
     {
         throw FaultExceptionHelper.GeenGav();
     }
 }
Esempio n. 6
0
        public IEnumerable <UitstapInfo> OphalenVanGroep(int groepId, bool inschrijvenMogelijk)
        {
            IEnumerable <Uitstap> resultaat;

            var groep = (from g in _groepenRepo.Select()
                         where g.ID == groepId
                         select g).FirstOrDefault();

            if (!_autorisatieMgr.IsGav(groep))
            {
                throw FaultExceptionHelper.GeenGav();
            }


            if (inschrijvenMogelijk)
            {
                // Enkel uitstappen van recentste groepswerkjaar
                var groepsWerkJaar = _groepsWerkJaarRepo.Select()
                                     .Where(gwj => gwj.Groep.ID == groepId)
                                     .OrderByDescending(gwj => gwj.WerkJaar)
                                     .First();

                resultaat = groepsWerkJaar.Uitstap.ToArray();
            }
            else
            {
                // Alle uitstappen ophalen
                resultaat = _uitstappenRepo.Select().Where(u => u.GroepsWerkJaar.Groep.ID == groepId).ToList();
            }

            return(_mappingHelper.Map <IEnumerable <Uitstap>, IEnumerable <UitstapInfo> >(resultaat));
        }
Esempio n. 7
0
 public void Check(Categorie g)
 {
     if (g == null || !_autorisatieMgr.IsGav(g.Groep))
     {
         throw FaultExceptionHelper.GeenGav();
     }
 }
Esempio n. 8
0
 public void Check(GelieerdePersoon g)
 {
     if (g == null || !_autorisatieMgr.IsGav(g))
     {
         throw FaultExceptionHelper.GeenGav();
     }
 }
        public int?AangelogdeGebruikerLidIdGet(int groepID)
        {
            int?adNummer = _authenticatieMgr.AdNummerGet();

            var ik = (from p in _personenRepo.Select()
                      where p.AdNummer == adNummer
                      select p).First();

            // Mag ik mijn eigen gegevens lezen?
            if (_autorisatieMgr.MagLezen(ik, ik))
            {
                throw FaultExceptionHelper.GeenGav();
            }

            var lps = (from gp in ik.GelieerdePersoon
                       where gp.Groep.ID == groepID
                       select gp).ToList();
            var leden = lps.SelectMany(gp => gp.Lid).ToList();

            if (!leden.Any())
            {
                return(null);
            }
            var maxJaar = leden.Max(l => l.GroepsWerkJaar.WerkJaar);

            return(leden.First(l => l.GroepsWerkJaar.WerkJaar == maxJaar).ID);
        }
Esempio n. 10
0
 public void Check(Persoon p)
 {
     if (p == null || !_autorisatieMgr.IsGav(p))
     {
         throw FaultExceptionHelper.GeenGav();
     }
 }
        public int TypeToggle(int lidId)
        {
            var origineelLid = _ledenRepo.ByID(lidId);
            Lid nieuwLid     = null;

            Gav.Check(origineelLid);

            try
            {
                nieuwLid = _ledenMgr.TypeToggle(origineelLid);
            }
            catch (FoutNummerException ex)
            {
                // Dit is misschien wat kort door de bocht:
                throw FaultExceptionHelper.FoutNummer(ex.FoutNummer, ex.Message);
            }

#if KIPDORP
            using (var tx = new TransactionScope())
            {
#endif
            _ledenRepo.Delete(origineelLid);
            _ledenSync.TypeUpdaten(nieuwLid);
            _ledenSync.AfdelingenUpdaten(nieuwLid);
            _ledenRepo.SaveChanges();
#if KIPDORP
            tx.Complete();
        }
#endif
            return(nieuwLid.ID);
        }
Esempio n. 12
0
 public void Check(Lid g)
 {
     if (g == null || !_autorisatieMgr.IsGav(g))
     {
         throw FaultExceptionHelper.GeenGav();
     }
 }
Esempio n. 13
0
        public int Bewaren(int groepId, UitstapInfo info)
        {
            // Als de uitstap een ID heeft, moet een bestaande uitstap opgehaald worden.
            // Anders maken we een nieuwe.

            Uitstap uitstap;
            bool    wasBivak = false;

            var groepsWerkJaar = _groepsWerkJaarRepo.Select()
                                 .Where(gwj => gwj.Groep.ID == groepId)
                                 .OrderByDescending(gwj => gwj.WerkJaar)
                                 .First();

            if (!_autorisatieMgr.IsGav(groepsWerkJaar.Groep))
            {
                throw FaultExceptionHelper.GeenGav();
            }

            if (info.ID == 0)
            {
                // Nieuwe uitstap
                uitstap = _mappingHelper.Map <UitstapInfo, Uitstap>(info);
                uitstap.GroepsWerkJaar = groepsWerkJaar;
                groepsWerkJaar.Uitstap.Add(uitstap);
            }
            else
            {
                // Haal origineel op, gekoppeld aan groepswerkjaar
                uitstap = (from u in groepsWerkJaar.Uitstap
                           where u.ID == info.ID
                           select u).First();
                wasBivak = uitstap.IsBivak;

                // overschrijf met gegevens uit 'info'
                _mappingHelper.Map(info, uitstap);
            }

#if KIPDORP
            using (var tx = new TransactionScope())
            {
#endif
            _groepsWerkJaarRepo.SaveChanges();

            if (uitstap.IsBivak)
            {
                _bivakSync.Bewaren(uitstap);
            }
            else if (wasBivak)
            {
                _bivakSync.Verwijderen(uitstap.ID);
            }

#if KIPDORP
            tx.Complete();
        }
#endif
            return(uitstap.ID);
        }
        public void FunctiesVervangen(int lidId, IEnumerable <int> functieIds)
        {
            var lid = _ledenRepo.ByID(lidId);

            if (_autorisatieMgr.PermissiesOphalen(lid) != Permissies.Bewerken)
            {
                throw FaultExceptionHelper.GeenGav();
            }

            var functies = _functiesRepo.ByIDs(functieIds);

            // TODO: optimaliseren. Tien tegen 1 zijn al die functies aan dezelfde groep gekoppeld.
            // (Als ze al gekoppeld zijn, want de nationale functies hebben geen gekoppelde groep.)
            // In dat geval volstaat het om 1 check te doen, ipv een check per functie.
            // TIP: controleer GAV-schap functies.SelectMany(fn=>fn.Groep).Distinct().

            if (functies.Any(functie => !_autorisatieMgr.PermissiesOphalen(functie).HasFlag(Permissies.Lezen)))
            {
                throw FaultExceptionHelper.GeenGav();
            }

            try
            {
                _functiesMgr.Vervangen(lid, functies);
            }
            catch (FoutNummerException ex)
            {
                switch (ex.FoutNummer)
                {
                case FoutNummer.GroepsWerkJaarNietBeschikbaar:
                case FoutNummer.FunctieNietVanGroep:
                case FoutNummer.FunctieNietBeschikbaar:
                case FoutNummer.LidTypeVerkeerd:
                case FoutNummer.EMailVerplicht:
                case FoutNummer.ContactMoetNieuwsBriefKrijgen:
                    // Deze exceptions verwachten we; we sturen een foutnummerfault
                    throw FaultExceptionHelper.FoutNummer(ex.FoutNummer, ex.Message);

                default:
                    // Onverwachte exception gooien we opnieuw op.
                    throw;
                }
            }

#if KIPDORP
            using (var tx = new TransactionScope())
            {
#endif
            _ledenRepo.SaveChanges();
            _ledenSync.FunctiesUpdaten(lid);
#if KIPDORP
            tx.Complete();
        }
#endif
        }
        public LidInfo LidInfoOphalen(int lidID)
        {
            var lid = _ledenRepo.ByID(lidID);

            Gav.Check(lid);
            if (lid.NonActief)
            {
                FaultExceptionHelper.FoutNummer(FoutNummer.LidUitgeschreven, Resources.LidInactief);
            }
            return(_mappingHelper.Map <Lid, LidInfo>(lid));
        }
        public PersoonInfo PersoonOphalen(int lidID)
        {
            var lid = _ledenRepo.ByID(lidID);

            Gav.Check(lid);
            if (lid.NonActief)
            {
                FaultExceptionHelper.FoutNummer(FoutNummer.LidUitgeschreven, Resources.LidInactief);
            }
            return(_mappingHelper.Map <GelieerdePersoon, PersoonInfo>(lid.GelieerdePersoon));
        }
Esempio n. 17
0
        public UitstapInfo Inschrijven(IList <int> gelieerdePersoonIDs, int geselecteerdeUitstapId,
                                       bool logistiekDeelnemer)
        {
            var uitstap = _uitstappenRepo.ByID(geselecteerdeUitstapId);

            Gav.Check(uitstap);

            var gelieerdePersonen = _gelieerdePersonenRepo.ByIDs(gelieerdePersoonIDs);

            if (!_autorisatieMgr.IsGav(gelieerdePersonen))
            {
                throw FaultExceptionHelper.GeenGav();
            }

            var groepen = (from gp in gelieerdePersonen select gp.Groep).Distinct().ToList();

            Debug.Assert(groepen.Any()); // De gelieerde personen moeten aan een groep gekoppeld zijn.
            Debug.Assert(uitstap.GroepsWerkJaar != null);
            Debug.Assert(uitstap.GroepsWerkJaar.Groep != null);

            // Als er meer dan 1 groep is, dan is er minstens een groep verschillend van de groep
            // van de uitstap (duivenkotenprincipe));););
            if (groepen.Count() > 1 || groepen.First().ID != uitstap.GroepsWerkJaar.Groep.ID)
            {
                throw new FoutNummerException(
                          FoutNummer.UitstapNietVanGroep,
                          Resources.FoutieveGroepUitstap);
            }

            // Koppel enkel de gelieerde personen die nog niet aan de uitstap gekoppeld zijn
            foreach (var gp in gelieerdePersonen.Where(gp => gp.Deelnemer.All(d => d.Uitstap.ID != uitstap.ID)))
            {
                var deelnemer = new Deelnemer
                {
                    GelieerdePersoon = gp,
                    Uitstap          = uitstap,
                    HeeftBetaald     = false,
                    IsLogistieker    = logistiekDeelnemer,
                    MedischeFicheOk  = false
                };

                // Moet dat nu nog alle twee gebeuren?
                gp.Deelnemer.Add(deelnemer);
                uitstap.Deelnemer.Add(deelnemer);
            }

            _gelieerdePersonenRepo.SaveChanges();
            return(_mappingHelper.Map <Uitstap, UitstapInfo>(uitstap));
        }
        public void RechtenToekennen(int gelieerdePersoonId, GebruikersRecht gebruikersRecht)
        {
            var gelieerdePersoon = _gelieerdePersonenRepo.ByID(gelieerdePersoonId);

            Gav.Check(gelieerdePersoon);

            if (gebruikersRecht == null)
            {
                // Als er geen gebruikersrechten meegegeven zijn, dan geven we de gelieerde persoon
                // rechten 'geen' op zijn eigen groep.
                gebruikersRecht = new GebruikersRecht();
            }

            var p = gelieerdePersoon.Persoon;

            if (p.AdNummer == null)
            {
                throw FaultExceptionHelper.FoutNummer(FoutNummer.AdNummerVerplicht,
                                                      Resources.AdNummerVerplicht);
            }
            if (string.IsNullOrEmpty(_gelieerdePersonenMgr.ContactEmail(gelieerdePersoon)))
            {
                throw FaultExceptionHelper.FoutNummer(FoutNummer.EMailVerplicht, Resources.EmailOntbreekt);
            }

            _gebruikersRechtenMgr.ToekennenOfWijzigen(gelieerdePersoon.Persoon, gelieerdePersoon.Groep,
                                                      gebruikersRecht.PersoonsPermissies, gebruikersRecht.GroepsPermissies, gebruikersRecht.AfdelingsPermissies,
                                                      gebruikersRecht.IedereenPermissies);


#if KIPDORP
            using (var tx = new TransactionScope())
            {
#endif
            _rechtenRepo.SaveChanges();

            // Zoekt de gegeven gebruiker in active directory. Maakt die gebruiker aan als die nog
            // niet bestaat. En voegt hem/haar toe aan de groep GapGebruikers.

            ServiceHelper.CallService <IAdService, string>(
                svc =>
                svc.GapLoginAanvragen(p.AdNummer.Value, p.VoorNaam, p.Naam,
                                      _gelieerdePersonenMgr.ContactEmail(gelieerdePersoon)));
#if KIPDORP
            tx.Complete();
        }
#endif
        }
Esempio n. 19
0
        public BivakAangifteLijstInfo BivakStatusOphalen(int groepId)
        {
            var resultaat = new BivakAangifteLijstInfo();

            var gwjQuery = _groepsWerkJaarRepo.Select();

            var groepsWerkJaar =
                gwjQuery.Where(gwj => gwj.Groep.ID == groepId).OrderByDescending(gwj => gwj.WerkJaar).FirstOrDefault();

            if (groepsWerkJaar == null || !_autorisatieMgr.IsGav(groepsWerkJaar))
            {
                throw FaultExceptionHelper.GeenGav();
            }

            if (!_uitstappenMgr.BivakAangifteVanBelang(groepsWerkJaar))
            {
                resultaat.AlgemeneStatus = BivakAangifteStatus.NogNietVanBelang;
            }
            else
            {
                resultaat.Bivakinfos = (from u in groepsWerkJaar.Uitstap
                                        where u.IsBivak
                                        select
                                        new BivakAangifteInfo
                {
                    ID = u.ID,
                    Omschrijving = u.Naam,
                    Status = _uitstappenMgr.StatusBepalen(u)
                }).ToList();

                if (resultaat.Bivakinfos.FirstOrDefault() == null)
                {
                    resultaat.AlgemeneStatus = BivakAangifteStatus.Ontbrekend;
                }
                else if (resultaat.Bivakinfos.Any(bi => bi.Status != BivakAangifteStatus.Ok))
                {
                    resultaat.AlgemeneStatus = BivakAangifteStatus.Ontbrekend;
                }
                else
                {
                    resultaat.AlgemeneStatus = BivakAangifteStatus.Ok;
                }
            }

            return(resultaat);
        }
        public GebruikersDetail DetailsOphalen(int adNummer, bool aanMaken)
        {
            int?mijnAdNummer = _authenticatieMgr.AdNummerGet();

            if (mijnAdNummer == null)
            {
                throw FaultExceptionHelper.FoutNummer(FoutNummer.KoppelingLoginPersoonOntbreekt, String.Format(
                                                          Resources.KoppelingLoginPersoonOntbreekt,
                                                          _authenticatieMgr.GebruikersNaamGet(),
                                                          mijnAdNummer));
            }
            var persoon = (from p in _personenRepo.Select()
                           where p.AdNummer == adNummer
                           select p).FirstOrDefault();
            var ik = (from p in _personenRepo.Select()
                      where p.AdNummer == mijnAdNummer
                      select p).FirstOrDefault();

            if (persoon == null && aanMaken)
            {
                // We gaan de persoon registreren. Als hij nog niet bestond, had hij nog geen rechten.
                // TODO: gegevens ophalen uit Civi, ipv leeg te laten (zie #5612).
                persoon = new Persoon
                {
                    // FIXME: stub-naam is niet zo goed. Misschien login erin verwerken?
                    VoorNaam = adNummer.ToString(),
                    Naam     = "AD-nummer",
                    AdNummer = mijnAdNummer,
                    Geslacht = GeslachtsType.Onbekend,
                };
                _personenRepo.Add(persoon);
                _personenRepo.SaveChanges();
            }

            // Controleer gebruikersrechten. Ik test ook op AD-nummer, want als ik mezelf net heb
            // aangemaakt loopt het anders fout.
            if (adNummer != mijnAdNummer && !_autorisatieMgr.MagLezen(ik, persoon))
            {
                throw FaultExceptionHelper.GeenGav();
            }

            return(_mappingHelper.Map <Persoon, GebruikersDetail>(persoon));
        }
        public int LoonVerliesVerzekeren(int lidId)
        {
            PersoonsVerzekering persoonsVerzekering;
            var lid = _ledenRepo.ByID(lidId);

            Gav.Check(lid);

            if (lid.GroepsWerkJaar.Groep.StopDatum != null && lid.GroepsWerkJaar.Groep.StopDatum < DateTime.Now)
            {
                throw FaultExceptionHelper.FoutNummer(FoutNummer.GroepInactief, Resources.GroepInactief);
            }

            var verzekeringstype = (from g in _verzekerRepo.Select() where g.ID == (int)Verzekering.LoonVerlies select g).First();

            try
            {
                persoonsVerzekering = _verzekeringenMgr.Verzekeren(lid, verzekeringstype, DateTime.Today,
                                                                   _groepsWerkJarenMgr.EindDatum(lid.GroepsWerkJaar));
            }
            catch (FoutNummerException ex)
            {
                throw FaultExceptionHelper.FoutNummer(ex.FoutNummer, ex.Message);
            }
            catch (BlokkerendeObjectenException <PersoonsVerzekering> )
            {
                // TODO: beter faultcontract. (VerzekeringsInfo?)
                throw FaultExceptionHelper.BestaatAl("Verzekering");
            }

#if KIPDORP
            using (var tx = new TransactionScope())
            {
#endif
            _verzekeringenSync.Bewaren(persoonsVerzekering, lid.GroepsWerkJaar);
            _ledenRepo.SaveChanges();
#if KIPDORP
            tx.Complete();
        }
#endif
            return(lid.GelieerdePersoon.ID);
        }
        public void RechtenAfnemen(int persoonID, int[] groepIDs)
        {
            var persoon = _personenRepo.ByID(persoonID);

            Gav.Check(persoon);

            if (persoon == null)
            {
                throw FaultExceptionHelper.GeenGav();
            }

            var teExpirenRechten =
                (from g in persoon.GebruikersRechtV2
                 where (g.VervalDatum == null || g.VervalDatum >= DateTime.Today) && groepIDs.Contains(g.Groep.ID)
                 select g).ToList();

            foreach (var gr in teExpirenRechten)
            {
                gr.VervalDatum = DateTime.Today.AddDays(-1);
            }

            _rechtenRepo.SaveChanges();
        }
        public void AfdelingenVervangenBulk(IList <int> lidIds, IList <int> afdelingsJaarIds)
        {
            // Dit is een beetje een rare functie. Als er meerdere leden zijn, en meerdere afdelingen, dan moeten
            // die leden allemaal kindleden zijn van hetzelfde groepswerkjaar. Anders gaat het mis.

            // TODO: een en ander verhuizen naar workers.

            var leden = _ledenRepo.ByIDs(lidIds);
            List <AfdelingsJaar> afdelingsJaren;

            if (afdelingsJaarIds.Any())
            {
                var gwjs = (from l in leden select l.GroepsWerkJaar).Distinct().ToList();
                if (gwjs.Count() != 1)
                {
                    // Er zijn groepswerkjaren meegegeven. Een afdelingsjaar is steeds gekoppeld
                    // aan precies 1 groepswerkjaar.
                    // De leden komen uit meer dan 1 groepswerkjaar. Het afdelingsjaar kan dus
                    // nooit gekoppeld zijn aan het groepswerkjaar van elk lid.
                    // (pigeon hole principle)
                    throw FaultExceptionHelper.FoutNummer(FoutNummer.AfdelingNietVanGroep,
                                                          Resources.OngelidgeAfdelingVoorLid);
                }
                afdelingsJaren = (from aj in gwjs.First().AfdelingsJaar
                                  where afdelingsJaarIds.Contains(aj.ID)
                                  select aj).ToList();

                if (afdelingsJaarIds.Count != afdelingsJaren.Count)
                {
                    // Niet alle afdelingsjaren zijn gevonden in het groepswerkjaar van de leden.
                    throw FaultExceptionHelper.FoutNummer(FoutNummer.AfdelingNietVanGroep,
                                                          Resources.OngelidgeAfdelingVoorLid);
                }
            }
            else
            {
                afdelingsJaren = new List <AfdelingsJaar>();
            }

            if (!_autorisatieMgr.IsGav(leden))
            {
                throw FaultExceptionHelper.GeenGav();
            }

            foreach (var lid in leden)
            {
                try
                {
                    _ledenMgr.AfdelingsJarenVervangen(lid, afdelingsJaren);
                }
                catch (FoutNummerException ex)
                {
                    if (ex.FoutNummer == FoutNummer.AlgemeneKindFout)
                    {
                        throw FaultExceptionHelper.FoutNummer(FoutNummer.AfdelingKindVerplicht, Resources.KindInEenAfdelingsJaar);
                    }
                    else
                    {
                        throw;
                    }
                }
            }

#if KIPDORP
            using (var tx = new TransactionScope())
            {
#endif
            foreach (var l in leden)
            {
                _ledenSync.AfdelingenUpdaten(l);
            }
            _ledenRepo.SaveChanges();
#if KIPDORP
            tx.Complete();
        }
#endif
        }
        public string VerzekeringsUrlGet(int groepID)
        {
            int?adNummer            = _authenticatieMgr.AdNummerGet();
            GelieerdePersoon mijnGp = null;

            if (adNummer == null)
            {
                throw FaultExceptionHelper.GeenGav();
            }

            var ik = (from p in _personenRepo.Select()
                      where p.AdNummer == adNummer
                      select p).First();

            if (ik != null)
            {
                mijnGp = (from gp in ik.GelieerdePersoon
                          where gp.Groep.ID == groepID
                          select gp).FirstOrDefault();
            }


            if (mijnGp == null)
            {
                throw new FaultException <FoutNummerFault>(new FoutNummerFault
                {
                    Bericht    = Resources.KoppelingLoginPersoonOntbreekt,
                    FoutNummer = FoutNummer.KoppelingLoginPersoonOntbreekt
                });
            }


            // haal puntkomma's uit onderdelen, want die zijn straks veldseparatiedingen
            var naam   = String.Format("{0} {1}", mijnGp.Persoon.VoorNaam, mijnGp.Persoon.Naam).Replace(';', ',');
            var stamnr = (from gr in ik.GebruikersRechtV2
                          where gr.Groep.ID == groepID
                          select gr.Groep.Code).First().Replace(';', ',');
            string email =
                mijnGp.Communicatie.Where(comm => comm.CommunicatieType.ID == (int)CommunicatieTypeEnum.Email)
                .OrderByDescending(comm => comm.Voorkeur)
                .Select(comm => comm.Nummer).FirstOrDefault();

            if (email == null)
            {
                throw new FaultException <FoutNummerFault>(new FoutNummerFault
                {
                    Bericht    = Resources.EmailOntbreekt,
                    FoutNummer = FoutNummer.EMailVerplicht
                });
            }

            email = email.Replace(';', ',');

            var cp = new CredentialsProvider(Settings.Default.EncryptieSleutel,
                                             Settings.Default.HashSleutel);

            var credentials = cp.Genereren(String.Format("{0};{1};{2};{3:dd/MM/yyyy H:mm:ss zzz}", naam, stamnr, email, DateTime.Now));

            return(String.Format(Settings.Default.UrlVerzekeraar,
                                 HttpUtility.UrlEncode(credentials.GeencrypteerdeUserInfo),
                                 HttpUtility.UrlEncode(credentials.Hash)));
        }
        public List <InschrijvingsVoorstel> InschrijvingVoorstellen(IList <int> gelieerdePersoonIds)
        {
            // TODO (#195): van onderstaande logica moet wel wat verhuizen naar de workers!
            var gelieerdePersonen = _gelieerdePersonenRepo.ByIDs(gelieerdePersoonIds);

            if (!_autorisatieMgr.IsGav(gelieerdePersonen) || gelieerdePersoonIds.Count != gelieerdePersonen.Count)
            {
                throw FaultExceptionHelper.GeenGav();
            }

            // We gaan ervan uit dat alle gelieerde personen op dit moment tot dezelfde groep behoren.
            // Maar in de toekomst is dat misschien niet meer zo. Dus laten we onderstaande constructie
            // maar staan.
            var groepen = (from gp in gelieerdePersonen select gp.Groep).Distinct().ToList();

            var resultaat = new List <InschrijvingsVoorstel>();

            foreach (var g in groepen)
            {
                var gwj = _groepenMgr.HuidigWerkJaar(g);

                foreach (var gp in gelieerdePersonen.Where(gelp => gelp.Groep.ID == g.ID).OrderByDescending(gp => gp.GebDatumMetChiroLeefTijd))
                {
                    var inschrijvingsVoorstel = new InschrijvingsVoorstel
                    {
                        GelieerdePersoonID = gp.ID,
                        VolledigeNaam      = gp.Persoon.VolledigeNaam
                    };

                    try
                    {
                        var voorstel  = _ledenMgr.InschrijvingVoorstellen(gp, gwj, true);
                        var validator = new LidVoorstelValidator();

                        inschrijvingsVoorstel.AfdelingsJaarIrrelevant = voorstel.AfdelingsJarenIrrelevant;
                        inschrijvingsVoorstel.AfdelingsJaarIDs        =
                            voorstel.AfdelingsJarenIrrelevant
                                ? new int[0]
                                : voorstel.AfdelingsJaren.Select(aj => aj.ID)
                            .ToArray();
                        inschrijvingsVoorstel.LeidingMaken  = voorstel.LeidingMaken;
                        inschrijvingsVoorstel.VolledigeNaam = gp.Persoon.VolledigeNaam;
                        inschrijvingsVoorstel.FoutNummer    = validator.FoutNummer(voorstel);
                    }
                    catch (FoutNummerException ex)
                    {
                        inschrijvingsVoorstel.FoutNummer = ex.FoutNummer;
                    }

                    if (inschrijvingsVoorstel.FoutNummer == null)
                    {
                        // Gelukte inschrijvingen achteraan toevoegen aan lijst.
                        resultaat.Add(inschrijvingsVoorstel);
                    }
                    else
                    {
                        // Foutberichten vooraan de feedback.
                        resultaat.Insert(0, inschrijvingsVoorstel);
                    }
                }
            }
            return(resultaat);
        }
        public List <InschrijvingsVoorstel> Inschrijven(IList <InschrijvingsVerzoek> inschrijfInfo)
        {
            // TODO: Te veel nesting. Opkuis nodig.

            var probleemGevallen = new List <InschrijvingsVoorstel>();
            var teSyncen         = new List <Lid>();

            var gelieerdePersonen = _gelieerdePersonenRepo.ByIDs(inschrijfInfo.Select(e => e.GelieerdePersoonID));

            if (!_autorisatieMgr.IsGav(gelieerdePersonen) || inschrijfInfo.Count() != gelieerdePersonen.Count)
            {
                throw FaultExceptionHelper.GeenGav();
            }

            // Mogelijk horen de gelieerde personen tot verschillende groepen.  Dat kan, als de GAV GAV is van
            // al die groepen. Als hij geen GAV is van de IDs, dan werd er al een exception gethrowd natuurlijk.
            var groepen = (from gp in gelieerdePersonen select gp.Groep).Distinct();

            foreach (var g in groepen)
            {
                bool groepInactief = g.StopDatum != null && g.StopDatum < DateTime.Now;

                // Per groep lid maken.
                // Zoek eerst recentste groepswerkjaar.
                var gwj = _groepenMgr.HuidigWerkJaar(g);

                foreach (var gp in gelieerdePersonen.Where(gelp => gelp.Groep.ID == g.ID).ToList())
                {
                    FoutNummer?foutNummer = groepInactief ? (FoutNummer?)FoutNummer.GroepInactief : null;

                    var info = (from i in inschrijfInfo where i.GelieerdePersoonID == gp.ID select i).First();

                    if (foutNummer == null)
                    {
                        var lidVoorstel = new LidVoorstel
                        {
                            AfdelingsJaren   = _afdelingsJaarRepo.ByIDs(info.AfdelingsJaarIDs),
                            LeidingMaken     = info.LeidingMaken,
                            GelieerdePersoon = gp,
                            GroepsWerkJaar   = gwj
                        };

                        // TODO: Dit is te veel business. Bekijken of een lid al ingeschreven is, moet in de workers gebeuren.

                        // Behandel leden 1 voor 1 zodat een probleem met 1 lid niet verhindert dat de rest bewaard wordt.

                        // Kijk of het lid al bestaat (eventueel niet-actief).  In de meeste gevallen zal dit geen
                        // resultaat opleveren.  Als er toch al een lid is, worden persoon, voorkeursadres, officiele afdeling,
                        // functies ook opgehaald, omdat een eventueel geheractiveerd lid opnieuw naar Kipadmin zal moeten.

                        var l = gp.Lid.FirstOrDefault(ld => ld.GroepsWerkJaar.ID == gwj.ID);

                        if (l != null) // al ingeschreven
                        {
                            if (l.UitschrijfDatum == null)
                            {
                                // Al ingeschreven als actief lid; we doen er verder niets mee.
                                // (Behalve een foutcode meegeven)

                                foutNummer = FoutNummer.LidWasAlIngeschreven;
                            }
                            else
                            {
                                l.UitschrijfDatum = null;
                                l.NonActief       = false;

                                if (lidVoorstel.LeidingMaken != (l.Type == LidType.Leiding))
                                {
                                    // lidtype moet worden veranderd

                                    Lid nieuwLid = null;
                                    try
                                    {
                                        nieuwLid = _ledenMgr.TypeToggle(l);
                                    }
                                    catch (FoutNummerException ex)
                                    {
                                        foutNummer = ex.FoutNummer;
                                    }

                                    if (foutNummer == null)
                                    {
                                        // verwijder bestaande lid
                                        _ledenRepo.Delete(l);

                                        // bewaar nieuw lid (ander type) in l; wordt straks
                                        // toegevoegd aan 'te syncen', waardoor het zal worden
                                        // bewaard en gesynct.

                                        l = nieuwLid;
                                    }
                                }
                                try
                                {
                                    _ledenMgr.AfdelingsJarenVervangen(l, lidVoorstel.AfdelingsJaren);
                                }
                                catch (FoutNummerException ex)
                                {
                                    foutNummer = ex.FoutNummer;
                                }

                                if (foutNummer == null)
                                {
                                    teSyncen.Add(l);
                                }
                            }
                        }
                        else // nieuw lid
                        {
                            try
                            {
                                l = _ledenMgr.NieuwInschrijven(lidVoorstel, false);

                                l.GelieerdePersoon.Persoon.InSync = true;
                                teSyncen.Add(l);
                            }
                            catch (BestaatAlException <Kind> )
                            {
                                foutNummer = FoutNummer.LidWasAlIngeschreven;
                            }
                            catch (BestaatAlException <Leiding> )
                            {
                                foutNummer = FoutNummer.LidWasAlIngeschreven;
                            }
                            catch (FoutNummerException ex)
                            {
                                foutNummer = ex.FoutNummer;
                            }
                            catch (GapException)
                            {
                                foutNummer = FoutNummer.AlgemeneLidFout;
                            }
                        }
                    }
                    if (foutNummer != null)
                    {
                        probleemGevallen.Add(new InschrijvingsVoorstel
                        {
                            GelieerdePersoonID      = gp.ID,
                            FoutNummer              = foutNummer,
                            VolledigeNaam           = gp.Persoon.VolledigeNaam,
                            AfdelingsJaarIDs        = info.AfdelingsJaarIDs,
                            AfdelingsJaarIrrelevant = info.AfdelingsJaarIrrelevant,
                            LeidingMaken            = info.LeidingMaken
                        });
                    }
                }
            }

#if KIPDORP
            using (var tx = new TransactionScope())
            {
#endif
            _ledenSync.Bewaren(teSyncen);
            _gelieerdePersonenRepo.SaveChanges();
#if KIPDORP
            tx.Complete();
        }
#endif


            return(probleemGevallen);
        }
        public void Uitschrijven(IList <int> gelieerdePersoonIDs, out string foutBerichten)
        {
            // Deze code is tamelijk rommelig; gebruik ze niet als referentie-implementatie
            // (Ik ben er ook niet van overtuigd of het werken met 'foutBerichten' wel in orde is.)
            var teVerwijderen    = new List <Lid>();
            var stopDatumBewaren = new List <Lid>();

            var foutBerichtenBuilder = new StringBuilder();

            var gelieerdePersonen = _gelieerdePersonenRepo.ByIDs(gelieerdePersoonIDs);

            if (!_autorisatieMgr.IsGav(gelieerdePersonen) || gelieerdePersoonIDs.Count() != gelieerdePersonen.Count)
            {
                throw FaultExceptionHelper.GeenGav();
            }

            var groepen = (from gp in gelieerdePersonen select gp.Groep).Distinct();

            foreach (var g in groepen)
            {
                if (g.StopDatum != null && g.StopDatum < DateTime.Now)
                {
                    throw FaultExceptionHelper.FoutNummer(FoutNummer.GroepInactief, Resources.GroepInactief);
                }

                var gwj = _groepenMgr.HuidigWerkJaar(g);

                // Handel per groep de uitschrijvingen af, zodat we per groep kunnen
                // controleren of de persoon wel ingeschreven is in het recentste groepswerkjaar.

                Groep g1 = g;
                foreach (var gp in gelieerdePersonen.Where(gp => Equals(gp.Groep, g1)))
                {
                    var lid = gp.Lid.FirstOrDefault(e => e.GroepsWerkJaar.ID == gwj.ID);

                    if (lid == null)
                    {
                        foutBerichtenBuilder.AppendLine(String.Format(Resources.IsNogNietIngeschreven,
                                                                      gp.Persoon.VolledigeNaam));
                        continue;
                    }
                    if (lid.NonActief)
                    {
                        foutBerichtenBuilder.AppendLine(String.Format(Resources.IsAlUitgeschreven,
                                                                      gp.Persoon.VolledigeNaam));
                        continue;
                    }

                    lid.UitschrijfDatum = DateTime.Now;
                    lid.Functie.Clear();

                    if (lid.EindeInstapPeriode > lid.UitschrijfDatum || lid.Niveau > Niveau.Groep)
                    {
                        teVerwijderen.Add(lid);
                    }
                    else
                    {
                        stopDatumBewaren.Add(lid);
                    }
                }
            }

            foutBerichten = foutBerichtenBuilder.ToString();

#if KIPDORP
            using (var tx = new TransactionScope())
            {
#endif
            _gelieerdePersonenRepo.SaveChanges();
            foreach (var l in teVerwijderen)
            {
                _ledenSync.Verwijderen(l);
            }
            foreach (var l in stopDatumBewaren)
            {
                _ledenSync.Bewaren(l);
            }
#if KIPDORP
            tx.Complete();
        }
#endif
        }