public HoursOfYear(string UserId, int Year) { this.Year = Year; this.User = db.Users.Find(UserId); this.ExtraExpected = User.HoursProfile.ExtraYear; var ExtraWeek = User.HoursProfile.ExtraWeek; // Raghruppo le ore in base alla settimana this.HoursOfWeek = db.UserWork(Year, UserId) .GroupBy(x => x.Week) .Select(x => new HoursOfWeek { Week = x.Key, Hours = x, ExtraExpected = ExtraWeek }); // Calcoli delle ore rimanenti di straordinario foreach (var w in HoursOfWeek) { // Verifico se sono finite le ore dell'anno if ((ExtraExpected - ExtraDone) <= TimeSpan.Zero) { break; } foreach (var h in w.Hours) { var exYear = ExtraExpected - ExtraDone; // Verifico se sono finite le ore dell'anno if (exYear <= TimeSpan.Zero) { break; } var exWeek = w.ExtraExpected - w.ExtraDone; // Verifico se sono finite le ore della settimana if (exWeek <= TimeSpan.Zero) { break; } var exExp = (h.IsFestivity || h.Date.DayOfWeek == DayOfWeek.Sunday || h.Date.DayOfWeek == DayOfWeek.Saturday) ? new TimeSpan(8, 0, 0) : new TimeSpan(2, 0, 0); // Verifico di non aver superato la settimana exExp = (exExp > exWeek) ? exWeek : exExp; // Verifico di non aver superato l'anno exExp = (exExp > exYear) ? exYear : exExp; // Setto Lo straordinario previsto h.ExtraExpected = exExp; } } }