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);
            }
        }
Example #3
0
        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));
        }