private static DateTime GetAeltesterDigitalisierungsTerminDesBenutzers(DigitalisierungsKategorie kategorie, DigipoolEntry[] digipool, DigipoolEntry digiItem) { return(digipool .Where(d => d.UserId == digiItem.UserId && d.Digitalisierunskategorie == (int)kategorie) .OrderBy(d => d.TerminDigitalisierung).FirstOrDefault()?.TerminDigitalisierung ?? DateTime.MinValue); }
public async Task RecalcTermine(DigitalisierungsKategorie kategorie, DigitalisierungsKontingent kontingent) { var digipool = (await orderDataAccess.GetDigipool()).Where(d => d.Digitalisierunskategorie == (int)kategorie).ToArray(); var newTermine = new List <DigitalisierungsTermin>(); foreach (var digiItem in digipool) { var letzterTerminDesBenutzers = GetAeltesterDigitalisierungsTerminDesBenutzers(kategorie, digipool, digiItem); var grenze = letzterTerminDesBenutzers == DateTime.MinValue ? DateTime.MinValue : letzterTerminDesBenutzers.AddDays(-kontingent.InAnzahlTagen); var termineToCheck = await orderDataAccess.GetLatestDigitalisierungsTermine(digiItem.UserId, grenze, kategorie); var foundEntry = termineToCheck.Where(t => t.Termin < letzterTerminDesBenutzers).OrderBy(t => t.Termin).FirstOrDefault(); DateTime referenzTermin; if (foundEntry != null) // Wenn ja, wird der jüngste Termin als Referenz genommen { referenzTermin = foundEntry.Termin; } else // Wenn nein, wird der älteste Termin aus dem digipool genommen { referenzTermin = digipool.Where(d => d.UserId == digiItem.UserId).Min(d => d.TerminDigitalisierung); } var termin = referenzTermin; if (!newTermine.Any() && referenzTermin != letzterTerminDesBenutzers) { Hochzaehlen(kontingent, ref termin); EnsureIsWorkingDay(ref termin); } else { termin = GetNextPossibleTermin(referenzTermin, newTermine.Where(t => t.UserId == digiItem.UserId).ToList(), kontingent); } var index = newTermine.FindIndex(n => n.Termin == termin && n.UserId == digiItem.UserId); if (index >= 0) { newTermine[index].AnzahlAuftraege++; } else { newTermine.Add(new DigitalisierungsTermin { AnzahlAuftraege = 1, Termin = termin, UserId = digiItem.UserId }); } Log.Debug("Neuberechnung für Auftrag {ID} beendet, vorher: {TERMINALT}, jetzt: {TERMINNEU}", digiItem.OrderItemId, digiItem.TerminDigitalisierung, termin); await orderDataAccess.UpdateTermin(digiItem.OrderItemId, termin); } }
public Task <List <DigitalisierungsTermin> > GetLatestDigitalisierungsTermine(string userId, DateTime fromDate, DigitalisierungsKategorie kategorie) { var termine = data.Values .Where(d => d.Status != OrderStatesInternal.Abgebrochen && d.Status != OrderStatesInternal.DigitalisierungAbgebrochen && d.TerminDigitalisierung.HasValue && (string.IsNullOrWhiteSpace(userId) || d.SachbearbeiterId == userId) && d.DigitalisierungsKategorie == kategorie && d.TerminDigitalisierung >= fromDate) .GroupBy(d => d.TerminDigitalisierung) .Select(d => new DigitalisierungsTermin { AnzahlAuftraege = d.Count(), Termin = d.Key.Value }) .ToList(); return(Task.FromResult(termine)); }