Beispiel #1
0
 /// <summary>
 /// Früh-, 8uhr-, 16Uhr-, Spätdienst
 /// </summary>
 /// <param name="dienst"></param>
 /// <returns></returns>
 public static bool IstRandDienst(this DienstTyp dienst)
 {
     return((dienst & DienstTyp.Frühdienst) == DienstTyp.Frühdienst ||
            (dienst & DienstTyp.AchtUhrDienst) == DienstTyp.AchtUhrDienst ||
            (dienst & DienstTyp.SechszehnUhrDienst) == DienstTyp.SechszehnUhrDienst ||
            (dienst & DienstTyp.SpätdienstEnde) == DienstTyp.SpätdienstEnde);
 }
Beispiel #2
0
        /// <summary>
        /// <SolidColorBrush x:Key="ColorSpaetdienst" Color="Red"/>
        /// <SolidColorBrush x:Key="ColorFruehdienst" Color="Yellow"/>
        /// <SolidColorBrush x:Key="ColorAchtUhrDienst" Color="DarkSeaGreen"/>
        /// <SolidColorBrush x:Key="ColorFsjFruehDienst" Color="DarkSeaGreen"/>
        /// <SolidColorBrush x:Key="ColorFsjSpaetDienst" Color="DarkSeaGreen"/>
        /// </summary>
        /// <param name="dienst"></param>
        /// <returns></returns>
        public static SolidColorBrush GetFarbeFromResources(this DienstTyp dienst)
        {
            var farbe = new SolidColorBrush();

            if (dienst == DienstTyp.None)
            {
                return(farbe);
            }

            var key = "";

            switch (dienst)
            {
            case DienstTyp.Frühdienst:
                key = "ColorFruehdienst";
                break;

            case DienstTyp.SpätdienstEnde:
                key = "ColorSpaetdienst";
                break;

            case DienstTyp.AchtUhrDienst:
                key = "ColorAchtUhrDienst";
                break;

            case DienstTyp.FsjSpätdienst:
                key = "ColorFsjSpaetDienst";
                break;

            case DienstTyp.FsjFrühdienst:
                key = "ColorFsjFruehDienst";
                break;

            default:
                return(farbe);
            }

            try
            {
                var color = Application.Current.TryFindResource(key) as SolidColorBrush;

                if (color == null)
                {
                    return(farbe);
                }

                farbe = color;
                return(farbe);
            }
            catch
            {
                return(farbe);
            }
        }
Beispiel #3
0
 private void SelectionChanged(object sender, PropertyChangedEventArgs e)
 {
     if (_handleIsSelectedChanged && e.PropertyName == "IsSelected")
     {
         if (Items.Cast <WunschdienstWrapper>().Any(x => x.IsSelected))
         {
             var       wd = Items.Cast <WunschdienstWrapper>().Where(x => x.IsSelected).ToList();
             DienstTyp st = (DienstTyp)0;
             foreach (var item in wd)
             {
                 st |= item.Dienst;
             }
             Wunschdienste = st;
         }
         else
         {
             Wunschdienste = DienstTyp.None;
         }
     }
 }
Beispiel #4
0
        private static PlanItem CreatePlanItem(Arbeitstag arbeitstag, Mitarbeiter ma, GruppenTyp gruppe, DienstTyp dienst, TimeRange vorgabe = null)
        {
            #region Planzeit ausrechnen
            var duration = ma.TagesQuarterTicks * 15;
            var start    = arbeitstag.KernzeitGruppeStart;
            var ende     = arbeitstag.KernzeitGruppeEnde;

            switch (dienst)
            {
            case DienstTyp.Frühdienst:
                start = arbeitstag.Frühdienst;
                ende  = arbeitstag.Frühdienst.AddMinutes(duration);
                break;

            case DienstTyp.AchtUhrDienst:
                start = arbeitstag.AchtUhrDienst;
                ende  = arbeitstag.AchtUhrDienst.AddMinutes(duration);
                break;

            case DienstTyp.KernzeitStartDienst:
                start = arbeitstag.KernzeitGruppeStart;
                ende  = arbeitstag.KernzeitGruppeStart.AddMinutes(duration);
                break;

            case DienstTyp.NeunUhrDienst:
                start = arbeitstag.NeunUhrDienst;
                ende  = arbeitstag.NeunUhrDienst.AddMinutes(duration);
                break;

            case DienstTyp.ZehnUhrDienst:
                start = arbeitstag.ZehnUhrDienst;
                ende  = arbeitstag.ZehnUhrDienst.AddMinutes(duration);
                break;

            case DienstTyp.FsjFrühdienst:
                start = arbeitstag.FrühdienstFsj;
                ende  = arbeitstag.FrühdienstFsj.AddMinutes(duration);
                break;

            case DienstTyp.FsjKernzeitdienst:
                start = arbeitstag.NormaldienstFsj;
                ende  = arbeitstag.NormaldienstFsj.AddMinutes(duration);
                break;

            case DienstTyp.FsjSpätdienst:
                start = arbeitstag.SpätdienstEndeFsj.AddMinutes(-1 * duration);
                ende  = arbeitstag.SpätdienstEndeFsj;
                break;

            case DienstTyp.KernzeitEndeDienst:
                start = arbeitstag.KernzeitGruppeEnde.AddMinutes(-1 * duration);
                ende  = arbeitstag.KernzeitGruppeEnde;
                break;

            case DienstTyp.SechszehnUhrDienst:
                start = arbeitstag.SechzehnUhrDienst.AddMinutes(-1 * duration);
                ende  = arbeitstag.SechzehnUhrDienst;
                break;

            case DienstTyp.SpätdienstEnde:
                start = arbeitstag.SpätdienstEnde.AddMinutes(-1 * duration);
                ende  = arbeitstag.SpätdienstEnde;
                break;

            case DienstTyp.Frei:
                duration = ma.TagesSollMinuten;
                start    = arbeitstag.KernzeitGruppeStart;
                ende     = arbeitstag.KernzeitGruppeStart.AddMinutes(duration);
                break;

            default:
                break;
            }
            var zeitraum = new TimeRange(start, ende);
            #endregion

            var result = new PlanItem();

            result.Arbeitstag    = arbeitstag;
            result.ErledigtDurch = ma;
            result.Thema         = ma?.DefaultThema ?? Themen.None;
            result.Zeitraum      = vorgabe ?? zeitraum;
            result.Gruppe        = gruppe;
            result.Dienst        = dienst;

            result.SetHatGrossteam();

            //Pausen mit Planen
            if (result.Zeitraum.Duration.TotalMinutes > 360)
            {
                if ((dienst & DienstTyp.KernzeitEndeDienst) == DienstTyp.KernzeitEndeDienst ||
                    (dienst & DienstTyp.SechszehnUhrDienst) == DienstTyp.SechszehnUhrDienst ||
                    (dienst & DienstTyp.SpätdienstEnde) == DienstTyp.SpätdienstEnde ||
                    (dienst & DienstTyp.FsjSpätdienst) == DienstTyp.FsjSpätdienst)

                {
                    result.Zeitraum.Start = result.Zeitraum.Start.AddMinutes(-1 * 30);
                }
                else
                {
                    result.Zeitraum.End = result.Zeitraum.End.AddMinutes(30);
                }
            }

            //Endzeiten einhalten
            AdjustEndzeitEnde(result);

            return(result);
        }
Beispiel #5
0
        private static Mitarbeiter NextMitarbeiter(IList <Mitarbeiter> alleDieDaSind, IList <Mitarbeiter> schonEingeteilt, Arbeitstag arbeitstag, Arbeitswoche woche = null, DienstTyp ma4Diensttyp = DienstTyp.None, GruppenTyp etage = GruppenTyp.Gelb | GruppenTyp.Gruen | GruppenTyp.Nest | GruppenTyp.Rot)
        {
            var arbeitstagPlanzeiten = arbeitstag.Planzeiten.ToList();

            var topf = alleDieDaSind.Except(schonEingeteilt).Where(x => x.DefaultGruppe.IstFarbGruppe()).ToList();

            if (topf.Count == 0)
            {
                return(null);
            }

            //alle die nicht allein sind in der gruppe
            var sonderTopf  = topf.ToList();
            var mitarbeiter = new List <Mitarbeiter>();

            //Wenn RandDienst dann gilt erstmal die Wunschdienst REgel zwingend
            if (ma4Diensttyp.IstRandDienst())
            {
                mitarbeiter = sonderTopf = topf.Where(x => (x.Wunschdienste & ma4Diensttyp) == ma4Diensttyp).ToList();
            }

            //erstma gucken für die ganz RandRand Dienste
            //alle verfügbaren wo mehr als einer noch in der Gruppe ist
            //und in der Gruppe darf noch keiner einen RandRandDienst haben
            if (sonderTopf.Count == 0 && ma4Diensttyp.IstRandRandDienst())
            {
                sonderTopf = topf.GroupBy(x => x.DefaultGruppe).Where(x => x.Count() > 1)
                             .SelectMany(x => x.Where(ma => !arbeitstagPlanzeiten.Any(y => y.Gruppe == ma.DefaultGruppe && y.Dienst.IstRandRandDienst()))).ToList();
            }

            //dann gucken für die ganz Rand Dienste
            if (sonderTopf.Count == 0 && ma4Diensttyp.IstRandDienst())
            {
                sonderTopf = topf.GroupBy(x => x.DefaultGruppe).Where(x => x.Count() > 1)
                             .SelectMany(x => x.Where(ma => !arbeitstagPlanzeiten.Any(y => y.Gruppe == ma.DefaultGruppe && y.Dienst.IstRandDienst()))).ToList();
            }

            //Probieren einen zu Finden aus einer Gruppen die noch keinen Randdienst hat
            if (sonderTopf.Count == 0 && ma4Diensttyp.IstRandDienst())
            {
                sonderTopf = topf.GroupBy(x => x.DefaultGruppe)
                             .SelectMany(x => x.Where(ma => !arbeitstagPlanzeiten.Any(y => y.Gruppe == ma.DefaultGruppe && y.Dienst.IstRandDienst()))).ToList();
            }

            //die mit Wunschdienst aus Etage
            if (mitarbeiter.Count == 0)
            {
                mitarbeiter = sonderTopf.Where(x => (x.Wunschdienste & ma4Diensttyp) == ma4Diensttyp && (etage & x.DefaultGruppe) == x.DefaultGruppe).ToList();
            }

            //die von Etage
            if (mitarbeiter.Count == 0)
            {
                mitarbeiter = sonderTopf.Where(x => (etage & x.DefaultGruppe) == x.DefaultGruppe).ToList();
            }

            //Wunschdienst
            if (mitarbeiter.Count == 0)
            {
                mitarbeiter = sonderTopf.Where(x => (x.Wunschdienste & ma4Diensttyp) == ma4Diensttyp).ToList();
            }

            //Wenn mit der RandDienstlogik niemand gefunden wurde, dann vllt vorher nochmal schauen ob ein Wunschdienstler Lust hat
            if (mitarbeiter.Count == 0 && ma4Diensttyp.IstRandDienst())
            {
                sonderTopf = topf.Where(x => (x.Wunschdienste & ma4Diensttyp) == ma4Diensttyp).ToList();
            }

            if (mitarbeiter.Count == 0)
            {
                mitarbeiter = sonderTopf;
            }

            if (mitarbeiter.Count == 0)//bei allen gucken wenn keiner will
            {
                mitarbeiter = topf;
            }

            //RandDienste Gleichverteilen über die Woche
            if (woche != null && ma4Diensttyp.IstRandDienst())
            {
                var geplanteRanddienste        = woche.Arbeitstage.SelectMany(x => x.Planzeiten.Where(p => p.Dienst == ma4Diensttyp)).ToList();
                var mitarbeiterMitRanddiensten = geplanteRanddienste.Select(x => x.ErledigtDurch).Distinct().ToList();

                //irgendein Mitarbeiter da, der noch gar nix hat
                if (mitarbeiter.Except(mitarbeiterMitRanddiensten).Any())
                {
                    mitarbeiter = mitarbeiter.Except(mitarbeiterMitRanddiensten).ToList();
                }
                else
                {
                    var mitarbeiterMitAnzahlRanddienstInderWoche = geplanteRanddienste.GroupBy(g => g.ErledigtDurch).ToDictionary(x => x.Key, c => c.Count());
                    var minCount = mitarbeiterMitAnzahlRanddienstInderWoche.Min(x => x.Value);
                    var mitarbeiterMitWenigstenCounts = mitarbeiterMitAnzahlRanddienstInderWoche.Where(x => x.Value == minCount).Select(x => x.Key).ToList();
                    var mitarbeiterMitMehrcounts      = mitarbeiterMitAnzahlRanddienstInderWoche.Where(x => x.Value != minCount).Select(x => x.Key).ToList();

                    if (mitarbeiter.Intersect(mitarbeiterMitWenigstenCounts).Any())
                    {
                        mitarbeiter = mitarbeiter.Intersect(mitarbeiterMitWenigstenCounts).ToList();
                    }
                    else if (mitarbeiter.Except(mitarbeiterMitRanddiensten.Except(mitarbeiterMitMehrcounts)).Any())
                    {
                        mitarbeiter = mitarbeiter.Except(mitarbeiterMitRanddiensten.Except(mitarbeiterMitMehrcounts)).ToList();
                    }

                    //sofern noch einer übrig bleibt soll derjenige der am Vortag das gemacht, nicht nochmal dran sein
                    var vortag = woche.Arbeitstage.Single(x => x.Datum == arbeitstag.Datum.AddDays(-1));
                    var letzte = vortag?.Planzeiten?.Where(x => x.Dienst == ma4Diensttyp).Select(x => x.ErledigtDurch).ToList() ?? new List <Mitarbeiter>();

                    if (mitarbeiter.Except(letzte).Any())
                    {
                        mitarbeiter = mitarbeiter.Except(letzte).ToList();
                    }
                }

                //am gleichen Tag vllt nicht unbedingt auch noch aus der gleichen gruppe
                var ma4Gruppencheck  = arbeitstag.Planzeiten.Where(x => x.Dienst == ma4Diensttyp).Select(x => x.ErledigtDurch).ToList();
                var maGleicherGruppe = mitarbeiter.Where(x => ma4Gruppencheck.Any(m => m.DefaultGruppe == x.DefaultGruppe)).ToList();
                if (mitarbeiter.Except(maGleicherGruppe).Any())
                {
                    mitarbeiter = mitarbeiter.Except(maGleicherGruppe).ToList();
                }
            }

            int ichBinDran = Zufall.Next(0, mitarbeiter.Count);

#if DEBUG
            Console.WriteLine($"{ma4Diensttyp}: {ichBinDran} von {mitarbeiter.Count}");
#endif
            return(mitarbeiter[ichBinDran]);
        }
Beispiel #6
0
        private void ChangePlanzeitCommandExecute(DienstTyp obj)
        {
            if (!CanChangePlanzeitCommandExecute(obj))
            {
                return;
            }

            var plan = Planzeit;

            var dauer = (int)plan.Zeitraum.Duration.TotalMinutes;

            if (dauer == 0)
            {
                dauer = _mitarbeiter.TagesArbeitszeitInMinuten;
            }

            switch (obj)
            {
            case DienstTyp.Frühdienst:
                plan.Dienst   = DienstTyp.Frühdienst;
                plan.Zeitraum = new TimeRange(plan.Arbeitstag.Frühdienst, plan.Arbeitstag.Frühdienst.AddMinutes(dauer));
                break;

            case DienstTyp.AchtUhrDienst:
                plan.Dienst   = DienstTyp.AchtUhrDienst;
                plan.Zeitraum = new TimeRange(plan.Arbeitstag.AchtUhrDienst, plan.Arbeitstag.AchtUhrDienst.AddMinutes(dauer));
                break;

            case DienstTyp.KernzeitStartDienst:
                plan.Dienst   = DienstTyp.KernzeitStartDienst;
                plan.Zeitraum = new TimeRange(plan.Arbeitstag.KernzeitGruppeStart, plan.Arbeitstag.KernzeitGruppeStart.AddMinutes(dauer));
                break;

            case DienstTyp.NeunUhrDienst:
                plan.Dienst   = DienstTyp.NeunUhrDienst;
                plan.Zeitraum = new TimeRange(plan.Arbeitstag.NeunUhrDienst, plan.Arbeitstag.NeunUhrDienst.AddMinutes(dauer));
                break;

            case DienstTyp.ZehnUhrDienst:
                plan.Dienst   = DienstTyp.ZehnUhrDienst;
                plan.Zeitraum = new TimeRange(plan.Arbeitstag.ZehnUhrDienst, plan.Arbeitstag.ZehnUhrDienst.AddMinutes(dauer));
                break;

            case DienstTyp.KernzeitEndeDienst:
                plan.Dienst   = DienstTyp.KernzeitEndeDienst;
                plan.Zeitraum = new TimeRange(plan.Arbeitstag.KernzeitGruppeEnde.AddMinutes(-1 * dauer), plan.Arbeitstag.KernzeitGruppeEnde);
                break;

            case DienstTyp.SechszehnUhrDienst:
                plan.Dienst   = DienstTyp.SechszehnUhrDienst;
                plan.Zeitraum = new TimeRange(plan.Arbeitstag.SechzehnUhrDienst.AddMinutes(-1 * dauer), plan.Arbeitstag.SechzehnUhrDienst);
                break;

            case DienstTyp.SpätdienstEnde:
                plan.Dienst   = DienstTyp.SpätdienstEnde;
                plan.Zeitraum = new TimeRange(plan.Arbeitstag.SpätdienstEnde.AddMinutes(-1 * dauer), plan.Arbeitstag.SpätdienstEnde);
                break;

            case DienstTyp.Frei:
                plan.Dienst   = DienstTyp.Frei;
                plan.Gruppe   = GruppenTyp.None;
                plan.Zeitraum = new TimeRange(plan.Arbeitstag.KernzeitGruppeStart, plan.Arbeitstag.KernzeitGruppeStart.AddMinutes((int)(_mitarbeiter.WochenStunden * 60 / 5)));
                OnPropertyChanged(nameof(EingeteiltSollTyp));
                _refreshAction();
                break;
            }
            RefreshPlanVonBisZeiten();
            OnPropertyChanged(nameof(PlanZeitenInfo));
            OnPropertyChanged(nameof(Planzeit));
        }
Beispiel #7
0
 private bool CanChangePlanzeitCommandExecute(DienstTyp arg)
 {
     return(Planzeit.Dienst != arg);
 }