/// <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();
            }
        }
        public List <LidOverzicht> LijstZoekenLidOverzicht(LidFilter filter, bool metAdressen)
        {
            // Onderstaande throwt een exception als de filter zaken bevat waar je geen rechten op
            // hebt.
            SecurityCheck(filter);

            List <LidOverzicht> resultaat;

            var leden = Zoeken(filter, metAdressen);

            // mappen
            if (metAdressen)
            {
                resultaat = _mappingHelper.Map <IList <Lid>, List <LidOverzicht> >(leden.ToList());
            }
            else
            {
                // TODO: Waarom wordt er hier twee keer gemapt?
                // Misschien om informatie expliciet niet mee te nemen?

                var list = _mappingHelper.Map <IList <Lid>, List <LidOverzichtZonderAdres> >(leden.ToList());
                resultaat = _mappingHelper.Map <IList <LidOverzichtZonderAdres>, List <LidOverzicht> >(list);
            }

            return(resultaat);
        }
        public List <PersoonLidInfo> LijstZoekenPersoonLidInfo(LidFilter filter)
        {
            // Onderstaande throwt een exception als de filter zaken bevat waar je geen rechten op
            // hebt.
            SecurityCheck(filter);

            var leden = Zoeken(filter, true);

            var resultaat = _mappingHelper.Map <IList <Lid>, List <PersoonLidInfo> >(leden.ToList());

            return(resultaat);
        }
        /// <summary>
        /// Zoekt alle leden die voldoen aan de gegeven <paramref name="filter"/>. Als
        /// <paramref name="metAdressen"/> <c>true</c> is, dan worden de adressen eager
        /// geload.
        /// </summary>
        /// <param name="filter">bepaalt de te zoeken leden</param>
        /// <param name="metAdressen">Als <c>true</c>, dan worden de adressen eager geload.</param>
        /// <returns>Enumerable voor de gevonden leden.</returns>
        private IEnumerable <Lid> Zoeken(LidFilter filter, bool metAdressen)
        {
            // Let op. Deze method is zorgvuldig geschreven opdat de lidinfo na 2 of 4 query's
            // (alnaargelang met of zonder adressen) allemaal geladen zou zijn.
            // Oorspronkelijk waren dat er een 10-tal per lid. (zie #1587)
            // Als je hier iets aanpast, controleer dan de gegenereerde query's. Of als je niet weet hoe daaraan
            // te beginnen, geef mij (johan) een seintje.

            var teLadenDependencies = new List <string>
            {
                "GelieerdePersoon.Communicatie.CommunicatieType",
                "Functie",
                "GelieerdePersoon.Persoon",
                "AfdelingsJaar.Afdeling"
            };

            if (metAdressen)
            {
                teLadenDependencies.Add("GelieerdePersoon.PersoonsAdres.Adres");
            }

            // Het lukt me niet om afdelingen eager te loaden, vermoedelijk omdat
            // die anders gekoppeld zijn aan kinderen en aan leiding. Dus ik doe
            // nu al het werk dubbel, 1 keer voor kinderen, 1 keer voor leiding.
            // Op het einde voeg ik de resultaten samen.

            var kinderen =
                (from ld in
                 _kinderenRepo.Select(teLadenDependencies.ToArray())
                 where
                 ld.UitschrijfDatum == null &&
                 (filter.GroepID == null || ld.GroepsWerkJaar.Groep.ID == filter.GroepID) &&
                 (filter.GroepsWerkJaarID == null || ld.GroepsWerkJaar.ID == filter.GroepsWerkJaarID) &&
                 (filter.FunctieID == null || ld.Functie.Any(e => e.ID == filter.FunctieID)) &&
                 (filter.ProbeerPeriodeNa == null || !ld.EindeInstapPeriode.HasValue ||
                  filter.ProbeerPeriodeNa < ld.EindeInstapPeriode.Value) &&
                 (filter.HeeftVoorkeurAdres == null ||
                  (ld.GelieerdePersoon.PersoonsAdres != null && filter.HeeftVoorkeurAdres == true) ||
                  (ld.GelieerdePersoon.PersoonsAdres == null && filter.HeeftVoorkeurAdres == false)) &&
                 (filter.HeeftTelefoonNummer == null ||
                  ld.GelieerdePersoon.Communicatie.Any(
                      e => e.CommunicatieType.ID == (int)CommunicatieTypeEnum.TelefoonNummer) ==
                  filter.HeeftTelefoonNummer) &&
                 (filter.HeeftEmailAdres == null ||
                  ld.GelieerdePersoon.Communicatie.Any(
                      e => e.CommunicatieType.ID == (int)CommunicatieTypeEnum.Email) ==
                  filter.HeeftEmailAdres) &&
                 (filter.HeeftVerdachtEmailAdres == null || ld.GelieerdePersoon.Communicatie.Any(
                      e => e.CommunicatieType.ID == (int)CommunicatieTypeEnum.Email &&
                      e.IsVerdacht == filter.HeeftVerdachtEmailAdres)) &&
                 (filter.AfdelingID == null || filter.AfdelingID == ld.AfdelingsJaar.Afdeling.ID)
                 select ld).ToList();

            var leiding = (from ld in
                           _leidingRepo.Select(teLadenDependencies.ToArray())
                           where
                           ld.UitschrijfDatum == null &&
                           (filter.GroepID == null || ld.GroepsWerkJaar.Groep.ID == filter.GroepID) &&
                           (filter.GroepsWerkJaarID == null || ld.GroepsWerkJaar.ID == filter.GroepsWerkJaarID) &&
                           (filter.FunctieID == null || ld.Functie.Any(e => e.ID == filter.FunctieID)) &&
                           (filter.ProbeerPeriodeNa == null || !ld.EindeInstapPeriode.HasValue ||
                            filter.ProbeerPeriodeNa < ld.EindeInstapPeriode.Value) &&
                           (filter.HeeftVoorkeurAdres == null ||
                            (ld.GelieerdePersoon.PersoonsAdres != null && filter.HeeftVoorkeurAdres == true) ||
                            (ld.GelieerdePersoon.PersoonsAdres == null && filter.HeeftVoorkeurAdres == false)) &&
                           (filter.HeeftTelefoonNummer == null ||
                            ld.GelieerdePersoon.Communicatie.Any(
                                e => e.CommunicatieType.ID == (int)CommunicatieTypeEnum.TelefoonNummer) ==
                            filter.HeeftTelefoonNummer) &&
                           (filter.HeeftEmailAdres == null ||
                            ld.GelieerdePersoon.Communicatie.Any(
                                e => e.CommunicatieType.ID == (int)CommunicatieTypeEnum.Email) ==
                            filter.HeeftEmailAdres) &&
                           (filter.HeeftVerdachtEmailAdres == null || ld.GelieerdePersoon.Communicatie.Any(
                                e => e.CommunicatieType.ID == (int)CommunicatieTypeEnum.Email &&
                                e.IsVerdacht == filter.HeeftVerdachtEmailAdres)) &&
                           (filter.AfdelingID == null ||
                            ld.AfdelingsJaar.Any(aj => aj.Afdeling.ID == filter.AfdelingID))
                           select ld).ToList();

            IEnumerable <Lid> leden;

            // Als lidtype=LidType.Geen, dan gaan we ervan uit dat dit een vergissing is, en de gebruiker
            // LidType.Alles bedoelt.

            if (filter.LidType != LidType.Leiding)
            {
                // Er zijn maar 2 lidtypes: Kind of Leiding.
                // Als de gebruiker niet expliciet naar de leiding vraagt, dan mogen we de kinderen
                // opleveren.

                leden = kinderen;
            }
            else
            {
                leden = new List <Lid>();
            }
            if (filter.LidType != LidType.Kind)
            {
                // Tenzij de user enkel de kinderen vraagt, leveren we de leiding op.

                leden = leden.Union(leiding);
            }


            if (metAdressen)
            {
                // Laad hier meteen alle adressen in 1 query. Entity Framework zal ze koppelen
                // aan de gelieerde personen die we al hebben. En zo vermijden we bij het mappen
                // een adresquery voor iedere gelieerde persoon.

                var gpIDs = (from l in leden select l.GelieerdePersoon.ID).ToList();

                // Resharper melding afzetten hieronder. Het is wel degelijk de bedoeling dat de query's worden
                // geevalueerd

                // ReSharper disable UnusedVariable
                var buitenlandseAdressen =
                    (from adr in _buitenlandseAdressenRepo.Select("PersoonsAdres.GelieerdePersoon", "Land")
                     where adr.PersoonsAdres.Any(pa => pa.GelieerdePersoon.Any(gp => gpIDs.Contains(gp.ID)))
                     select adr).ToList();
                var belgischeAdressen =
                    (from adr in _belgischeAdressenRepo.Select("PersoonsAdres.GelieerdePersoon", "StraatNaam", "Woonplaats")
                     where adr.PersoonsAdres.Any(pa => pa.GelieerdePersoon.Any(gp => gpIDs.Contains(gp.ID)))
                     select adr).ToList();
                // ReSharper restore UnusedVariable
            }
            return(leden);
        }
Esempio n. 5
0
 public List <LidOverzicht> LijstZoekenLidOverzicht(LidFilter filter, bool metAdressen)
 {
     throw new NotImplementedException();
 }
Esempio n. 6
0
 public List <PersoonLidInfo> LijstZoekenPersoonLidInfo(LidFilter filter)
 {
     throw new NotImplementedException();
 }