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 })); } }
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); //} }