/// <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); }
/// <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); } }
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; } } }
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); }
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]); }
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)); }
private bool CanChangePlanzeitCommandExecute(DienstTyp arg) { return(Planzeit.Dienst != arg); }