public async Task <IActionResult> Save([FromBody] TimeSheetSaveModel model)
        {
            try
            {
                model.SetAddedByUser(GetCurrentUserId());

                return(Ok(await _timeSheets.Save(model)));
            }
            catch (ClientException ex)
            {
                return(BadRequest(new { message = ex.Message }));
            }
            catch (Exception ex)
            {
                return(StatusCode(500, new { message = ex.Message }));
            }
        }
示例#2
0
        public async Task <TimeSheet> Save(TimeSheetSaveModel model)
        {
            IQueryable <DataSets.TimeSheet> conflictQuery = db.TimeSheets.Where(c => c.UserId == model.userId &&
                                                                                ((model.fromDate >= c.FromDate && model.fromDate <= c.ToDate) ||
                                                                                 (model.toDate >= c.FromDate && model.toDate <= c.ToDate)));

            void ensureNoConflict(DataSets.TimeSheet ts)
            {
                if (ts != null)
                {
                    throw new ClientException($"Dates {model.fromDate.ToShortDateString()}/{model.toDate.ToShortDateString()} Fall betweeen user's timesheet dates {ts.FromDate.ToShortDateString()}/{ts.ToDate.ToShortDateString()}");
                }
            }

            if (model.fromDate >= model.toDate)
            {
                throw new ClientException("from date must be before to date");
            }


            if (model.id.HasValue)
            {
                var possibleConflictTimeSheet = conflictQuery.Where(k => k.ID != model.id.Value).FirstOrDefault();

                ensureNoConflict(possibleConflictTimeSheet);

                // # save timeSheet #

                // get timeSheet

                var dbTimeSheet = db.TimeSheets.FirstOrDefault(k => k.ID == model.id.Value);

                if (dbTimeSheet == null)
                {
                    throw new ClientException("record not found");
                }

                // check activities
                var minActivity = db.TimeSheetActivities
                                  .OrderBy(k => k.FromDate)
                                  .FirstOrDefault();

                var maxActivity = db.TimeSheetActivities
                                  .OrderByDescending(k => k.FromDate)
                                  .FirstOrDefault();



                if (minActivity != null && model.fromDate > minActivity.FromDate)
                {
                    throw new ClientException($"from date should be before {minActivity.FromDate.Date.ToDisplayDate()} which is the earliest activity made on that date on the schedule");
                }


                if (maxActivity != null && model.toDate < maxActivity.FromDate)
                {
                    throw new ClientException($"to date should be after {maxActivity.FromDate.Date.ToDisplayDate()} which is the latest activity made on that date on the schedule");
                }

                // update values

                dbTimeSheet.FromDate = model.fromDate;
                dbTimeSheet.ToDate   = model.toDate;

                db.SaveChanges();


                await notificationMethods.Send(model.GetAddedByUser(), model.userId, $"schedule time was modified", NotificationType.Information, true, dbTimeSheet.ID);



                var parsed = _mapper.Map <TimeSheet>(dbTimeSheet);

                parsed.HasTasks = db.TimeSheetTasks.Any(k => k.TimeSheetId == parsed.ID);

                var addedByUser = db.Users.First(k => k.Id == dbTimeSheet.AddedByUserId);

                parsed.AddedByUserName = addedByUser.FirstName + " " + addedByUser.LastName;

                return(parsed);
            }
            else
            {
                var possibleConflictTimeSheet = conflictQuery.FirstOrDefault();

                ensureNoConflict(possibleConflictTimeSheet);

                // # new timesheet #

                DataSets.TimeSheet dbTimeSheet = new DataSets.TimeSheet()
                {
                    UserId        = model.userId,
                    FromDate      = model.fromDate,
                    ToDate        = model.toDate,
                    DateAdded     = DateTime.Now,
                    AddedByUserId = model.GetAddedByUser()
                };

                // add the timeSheet
                db.TimeSheets.Add(dbTimeSheet);

                // save changes on teamstimeSheets
                db.SaveChanges();

                await notificationMethods.Send(model.GetAddedByUser(), model.userId, $"New schedule added", NotificationType.Default, true, dbTimeSheet.ID);

                var parsed = _mapper.Map <TimeSheet>(dbTimeSheet);

                var addedByUser = db.Users.First(k => k.Id == dbTimeSheet.AddedByUserId);

                parsed.AddedByUserName = addedByUser.FirstName + " " + addedByUser.LastName;

                return(parsed);
            }


            //DataSets.TimeSheet dbTimeSheet = new DataSets.TimeSheet()
            //{
            //    FromDate = fromDate,
            //    ToDate = toDate,
            //    DateAdded = DateTime.Now,
            //    UserId = userId
            //};

            //db.TimeSheets.Add(dbTimeSheet);

            //if (db.SaveChanges() > 0)
            //{
            //    return _mapper.Map<TimeSheet>(dbTimeSheet);
            //}
        }