Ejemplo n.º 1
0
        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, "خطا در دریافت اطلاعات تایم شیت"));
            }
        }