public async Task <IActionResult> GetTimeSheet(string ver, Guid?userId, DateTime?fromDate, DateTime?toDate) { var isWantingApprove = userId.HasValue; try { if (!this.MainChecks(ver, out string error)) { throw new Exception(error); } DisplayPeriodManager displayPeriodMnager = new DisplayPeriodManager(this._uow); User currentUser = new UserHelper().GetCurrent(this._uow, this.UserName); if (!fromDate.HasValue) { DisplayPeriod displayPeriod = displayPeriodMnager.GetDisplayPeriod(currentUser); if (!fromDate.HasValue) { fromDate = DateTime.Now.AddDays(-7); } if (!toDate.HasValue) { toDate = DateTime.Now; } if (displayPeriod.IsWeekly) { fromDate = DateTime.Today.StartOfWeek(DayOfWeek.Saturday); toDate = DateTime.Today.EndOfWeek(DayOfWeek.Friday); } else { toDate = fromDate.Value.AddDays(displayPeriod.NumOfDays); } } var mustCheckDefaultTimeSheetPolocy = false; var now = DateTime.Now; mustCheckDefaultTimeSheetPolocy = now >= fromDate && now <= toDate; var numberOfReset = -1; labelForReset: numberOfReset++; IQueryable <Persistance.QueryEntities.EmployeeTimeSheetFromDB> query = null; if (isWantingApprove) { query = this.DBContext.spFoundConfirmTimeSheet.FromSqlInterpolated(this.DBContext.spFoundConfirmTimeSheet_str( currentUser.ID, userId, fromDate.Value, toDate.Value )); } else { query = this.DBContext.spFoundConfirmTimeSheet.FromSqlInterpolated(this.DBContext.spFoundEmployeeTimeSheet_str( currentUser.ID, fromDate.Value, toDate.Value )); } var items = await query.ToListAsync(); var days = new string[] { "شنبه", "یکشنبه", "دوشنبه", "سه شنبه", "چهارشنبه", "پنج شنبه", "جمعه" }; var answer = items.GroupBy(g => g.Date) .Select(gg => new vmGetTimeSheetResualt { date = gg.Key.Value, isOpen = gg.FirstOrDefault().IsOpen, mustHaveHozoor = gg.First().UserMustHasHozoor, dayTimeString = gg.FirstOrDefault().DayTimeString, date_persian = gg.First().PersianDate, day_persian = days[gg.First().DayOfWeek.Value], hozoor = gg.First().Hozoor, projects = gg.Where(p => p.Type == "Work" && p.ProjectId.HasValue) .GroupBy(p => p.ProjectId).Select(pp => new vmGetTimeSheetResualt_Project { id = pp.Key, title = pp.First().ProjectTitle, workouts = pp.Where(w => w.TaskId.HasValue) .GroupBy(w => new { w.TaskId, w.State }).Select(ww => new vmGetTimeSheetResualt_Workout { id = ww.Key.TaskId, state = ww.Key.State, title = ww.First().Title, minutes = ww.First().Minutes }).ToList() }).ToList(), others = gg.Where(p => p.Type == "Other" && p.ProjectId.HasValue) .GroupBy(p => p.State).Select(pp => new vmGetTimeSheetResualt_Project { id = pp.First().ProjectId, title = pp.Key, workouts = pp.Where(w => w.TaskId.HasValue) .GroupBy(w => w.TaskId).Select(ww => new vmGetTimeSheetResualt_Workout { id = ww.First().TaskId, state = ww.First().State, title = ww.First().Title, minutes = ww.Sum(www => www.Minutes) }).ToList() }).ToList() }).ToList(); if (mustCheckDefaultTimeSheetPolocy && !answer.First(a => a.date.Value.Date == now.Date).isOpen.HasValue) { //default policy must check maybe is deactivated //if isnot created, must create and today is open beacuase friday is checked in query //اگر زمانش گذشته باید تمدید بشه که با تاریخ های امروز یکسان بشه var userDefaultPolicy = this.DBContext.TimesheetPolicies.FirstOrDefault(p => p.IsDefault && p.UserId == currentUser.ID); if (userDefaultPolicy == null) { userDefaultPolicy = new TimesheetPolicy() { Id = Guid.NewGuid(), IsDefault = true, isDeactivated = false, IsOpen = true, UserMustHasHozoor = true, UserId = currentUser.ID, }; this.DBContext.TimesheetPolicies.Add(userDefaultPolicy); } userDefaultPolicy.Start = DateUtility.GetCompanyStartDate(); userDefaultPolicy.Finish = DateUtility.GetCompanyEndDate(); userDefaultPolicy.Validity = DateUtility.GetCompanyEndDate(); userDefaultPolicy.CreateDate = DateTime.Now; this.DBContext.SaveChanges(); if (numberOfReset < 1) { goto labelForReset; } } return(Ok(answer)); } catch (Exception ex) { return(this.ReturnError(ex, "خطا در دریافت اطلاعات تایم شیت")); } }