public ActionResult <GenericHourEntry> RegisterPaidOvertime([FromBody] GenericHourEntry request) { if (request.Hours < 0) { return(BadRequest("Input value must be positive number")); } if (request.Hours % 0.5M != 0) { return(BadRequest("Input value must be a multiple of a half hour (0.5)")); } var user = _userRetriever.RetrieveUser(); var response = _storage.RegisterPaidOvertime(request, user.Id); if (response is OkObjectResult) { return(Ok(new { Date = request.Date.ToDateOnly(), Value = request.Hours })); } return(BadRequest(response.Value)); }
public ObjectResult RegisterPaidOvertime(GenericHourEntry request, int userId) { var user = _context.User.SingleOrDefault(u => u.Id == userId); var startDate = user.StartDate; List <DateEntry> entriesByDate = GetTimeEntries(startDate, request.Date, userId); var registeredPayouts = GetRegisteredPayouts(userId); List <OvertimeEntry> overtimeEntries = GetOvertimeEntries(entriesByDate, startDate, request.Date); CompensateForOffTime(overtimeEntries, entriesByDate, startDate, request.Date, userId); CompensateForRegisteredPayouts(overtimeEntries, registeredPayouts); var availableOvertimeEquivalents = GetOvertimeEquivalents(startDate, request.Date, userId); if (request.Hours <= availableOvertimeEquivalents) { PaidOvertime paidOvertime = new PaidOvertime { Date = request.Date, User = userId, Value = request.Hours }; _context.PaidOvertime.Add(paidOvertime); _context.SaveChanges(); return(new OkObjectResult(paidOvertime)); } return(new BadRequestObjectResult("Not enough available hours")); }
public ActionResult <GenericHourEntry> RegisterPaidOvertime([FromBody] GenericHourEntry request) { if (!ModelState.IsValid) { return(BadRequest(ModelState.Values)); } var user = _userRetriever.RetrieveUser(); var response = _storage.RegisterPaidOvertime(new GenericHourEntry { Hours = request.Hours, Date = request.Date }, user.Id); return(Ok(new GenericHourEntry { Date = response.Date, Hours = response.HoursBeforeCompensation })); }
public PaidOvertimeEntry RegisterPaidOvertime(GenericHourEntry request, int userId) { var user = _context.User.SingleOrDefault(u => u.Id == userId); var userStartDate = user.StartDate; var dateToStartCalculation = userStartDate > _startOfOvertimeSystem ? userStartDate : _startOfOvertimeSystem; var overtimeEntries = GetOvertimeEntriesAfterOffTimeAndPayouts(dateToStartCalculation, request.Date, userId); var availableForPayout = overtimeEntries.Sum(ot => ot.Hours); var hoursAfterCompRate = GetHoursAfterCompRate(overtimeEntries, request.Hours); if (request.Hours <= availableForPayout) { PaidOvertime paidOvertime = new PaidOvertime { Date = request.Date, User = userId, HoursBeforeCompRate = request.Hours, HoursAfterCompRate = hoursAfterCompRate }; _context.PaidOvertime.Add(paidOvertime); _context.SaveChanges(); return(new PaidOvertimeEntry() { UserId = paidOvertime.Id, Date = paidOvertime.Date, HoursBeforeCompensation = paidOvertime.HoursBeforeCompRate, HoursAfterCompensation = paidOvertime.HoursAfterCompRate }); } throw new ValidationException("Not enough available hours"); }