public void Setup() { InitializeMocks(); InitializeLoggerMock(new MotivationModificatorsService(null, null, null)); _staff1 = new Staff { Id = 1 }; _staff2 = new Staff { Id = 2 }; _dbContext.Staff.Add(_staff1); _dbContext.Staff.Add(_staff2); _motivationModificator1 = new MotivationModificator { Id = 1, CreatedOn = _dateTimeUtil.GetCurrentDateTime(), ModValue = 0.89, StaffId = _staff1.Id }; _dbContext.MotivationModificators.Add(_motivationModificator1); _motivationModificatorsService = new MotivationModificatorsService(_motivationModificatorRepository, _logger, _dateTimeUtil); }
public void GetByStaffId_should_return_modificator_with_specified_staffId() { // Act MotivationModificator actual = _motivationModificatorRepository.GetByStaffId(_motivationModificator1.StaffId); // Assert Assert.AreEqual(_motivationModificator1, actual, "Data returnted as expected"); }
private static MotivationModificatorData ToRpcModel(MotivationModificator motivationModificator) { return(new MotivationModificatorData { Id = motivationModificator.Id, StaffId = motivationModificator.StaffId, ModValue = motivationModificator.ModValue, CreatedOn = Timestamp.FromDateTime(motivationModificator.CreatedOn) }); }
public virtual async Task <int> AddAsync(MotivationModificator modificator) { CheckData(modificator); if (_context.MotivationModificators.Any(e => e.StaffId == modificator.StaffId)) { throw new InvalidOperationException("Motivation modificator already exists for specified work period"); } modificator.CreatedOn = _dateTimeUtil.GetCurrentDateTime(); _context.MotivationModificators.Add(modificator); return(await _context.SaveChangesAsync()); }
public void AddAsync_should_add_extity_to_db() { // Arrange MotivationModificator motivationModificator = new() { ModValue = 0.5, StaffId = _staff3.Id }; // Act int result = _motivationModificatorRepository.AddAsync(motivationModificator).Result; MotivationModificator actual = _dbContext.MotivationModificators.FirstOrDefault(e => e.Id == motivationModificator.Id); // Assert Assert.AreEqual(1, result, "Added as expected"); Assert.AreEqual(motivationModificator, actual, "Data in modificator as expected"); _dbContextMock.Verify(m => m.SaveChangesAsync(true, new CancellationToken()), Times.Once); }
private void CheckData(MotivationModificator modificator) { if (modificator is null) { throw new NullReferenceException("Motificator cannot be empty"); } if (modificator.StaffId == 0) { throw new ArgumentException("Work period is not specified"); } if (!_context.Staff.Any(e => e.Id == modificator.StaffId)) { throw new ArgumentException("Cannot modify motivation for work period which does not exists"); } if (modificator.ModValue <= 0) { throw new ArgumentException("Motivation mod cannot be less than 0 or equal to 0"); } }
public override Task <MotivationModificatorResponse> GetByStaffId(ByStaffIdRequest request, ServerCallContext context) { MotivationModificatorResponse response = new() { Status = new BaseResponse { Code = Code.Success, ErrorMessage = string.Empty } }; try { MotivationModificator motivationModificator = _motivationModificatorRepository.GetByStaffId(request.StaffId); response.Data = motivationModificator is null ? null: ToRpcModel(motivationModificator); LogData logData = new() { CallSide = nameof(MotivationModificatorsService), CallerMethodName = nameof(GetByStaffId), CreatedOn = _dateTimeUtil.GetCurrentDateTime(), Request = request, Response = response }; _logger.AddLog(logData); } catch (Exception ex) { LogData logData = new() { CallSide = nameof(MotivationModificatorsService), CallerMethodName = nameof(GetByStaffId), CreatedOn = _dateTimeUtil.GetCurrentDateTime(), Request = request, Response = ex }; _logger.AddErrorLog(logData); response.Status.Code = Code.UnknownError; response.Status.ErrorMessage = "An error occured while loading motivation modificator data"; } return(Task.FromResult(response)); }
public void Setup() { InitializeMocks(); DbContextMock.ShouldThrowException = false; _staff1 = new Staff { Id = 1 }; _staff2 = new Staff { Id = 2 }; _staff3 = new Staff { Id = 3 }; _dbContext.Staff.Add(_staff1); _dbContext.Staff.Add(_staff2); _dbContext.Staff.Add(_staff3); _motivationModificator1 = new MotivationModificator { Id = 1, CreatedOn = _dateTimeUtil.GetCurrentDateTime(), ModValue = 0.8, StaffId = _staff1.Id }; _motivationModificator2 = new MotivationModificator { Id = 2, CreatedOn = _dateTimeUtil.GetCurrentDateTime(), ModValue = 0.9, StaffId = _staff2.Id }; _dbContext.MotivationModificators.Add(_motivationModificator1); _dbContext.MotivationModificators.Add(_motivationModificator2); _motivationModificatorRepository = new MotivationModificatorRepository(_dbContext, _dateTimeUtil); }
public virtual async Task <int> UpdateAsync(MotivationModificator modificator) { CheckData(modificator); _context.MotivationModificators.Update(modificator); return(await _context.SaveChangesAsync()); }
public override Task <ISalaryResponse> GetSalary(SalaryRequest request, ServerCallContext context) { ISalaryResponse response = new() { Status = new BaseResponse { Code = Code.Success, ErrorMessage = string.Empty } }; try { IQueryable <Staff> staffs = request.ManagerId == 0 ? _staffRepository.GetAll() : _staffRepository.GetByManagerId(request.ManagerId); IQueryable <IGrouping <long?, Staff> > groupedStaff = staffs.Where(e => e.PersonId.HasValue) .GroupBy(e => e.PersonId); foreach (IGrouping <long?, Staff> data in groupedStaff) { SalaryResponse salaryResponse = CalculateCurrentSalary(data, request.StartDate.ToDateTime(), request.EndDate.ToDateTime()); salaryResponse = CalculateOtherPayments(salaryResponse, request.StartDate.ToDateTime(), request.EndDate.ToDateTime()); response.SalaryResponse.Add(salaryResponse); } } catch (NullReferenceException nrex) { LogData logData = new() { CallSide = nameof(SalaryService), CallerMethodName = nameof(GetSalary), CreatedOn = _dateTimeUtil.GetCurrentDateTime(), Request = request, Response = nrex }; _logger.AddErrorLog(logData); response.Status.ErrorMessage = $"Some data has not found (type: {nrex.GetType().Name})"; response.Status.Code = Code.DataError; } catch (Exception ex) { LogData logData = new() { CallSide = nameof(SalaryService), CallerMethodName = nameof(GetSalary), CreatedOn = _dateTimeUtil.GetCurrentDateTime(), Request = request, Response = ex }; _logger.AddErrorLog(logData); response.Status.ErrorMessage = ex.Message; response.Status.Code = Code.UnknownError; } LogData log = new() { CallSide = nameof(SalaryService), CallerMethodName = nameof(GetSalary), CreatedOn = _dateTimeUtil.GetCurrentDateTime(), Request = request, Response = response }; _logger.AddLog(log); return(Task.FromResult(response)); } private SalaryResponse CalculateCurrentSalary(IGrouping <long?, Staff> staff, DateTime startDate, DateTime endDate) { IQueryable <DayOff> dayOffs = _dayOffRepository.GetByDateRangeAndPersonId(startDate, endDate, staff.First().PersonId.Value); IQueryable <Holiday> holidays = _holidaysRepository.GetByDateRange(startDate, endDate); SalaryResponse response = new() { StartedOn = Timestamp.FromDateTime(staff.First().CreatedOn.ToUniversalTime()) }; double workHours = GetWorkHours(); for (DateTime current = startDate.Date; current.Date <= endDate.Date; current = current.AddDays(1)) { bool todoDay = (current.DayOfWeek == DayOfWeek.Saturday || current.DayOfWeek == DayOfWeek.Sunday) && holidays.Any(e => e.ToDoDate.HasValue && e.ToDoDate.Value.Date == current.Date); bool workDay = current.DayOfWeek != DayOfWeek.Saturday && current.DayOfWeek != DayOfWeek.Sunday && !holidays.Any(e => e.HolidayDate.Date == current.Date); Staff currentStaff = staff.OrderByDescending(e => e.CreatedOn).FirstOrDefault(e => e.CreatedOn.Date <= current.Date); if (currentStaff is not null) { Position position = _positionsRepository.Get(currentStaff.PositionId); MotivationModificator modificator = null; if (currentStaff.MotivationModificatorId.HasValue) { modificator = _motivationModificatorRepository.GetByStaffId(currentStaff.MotivationModificatorId.Value); } double rate = modificator != null ? position.HourRate * modificator.ModValue : position.HourRate; response.CurrentPosition = position.Id; response.PersonId = currentStaff.PersonId.GetValueOrDefault(); if (workDay || todoDay) { if (!dayOffs.Any(e => e.CreatedOn.Date == current.Date)) { response.Salary += workHours * rate; } else { DayOff dayOff = dayOffs.First(e => e.CreatedOn.Date == current.Date); response.DayOffs.Add(new DayOffInfo { DayOffType = (int)dayOff.DayOffType, Hours = dayOff.Hours }); if (dayOff.IsPaid) { if (dayOff.Hours < workHours) { response.Salary += dayOff.Hours * rate + (workHours - dayOff.Hours) * rate; } else { response.Salary += dayOff.Hours * rate; } } else { response.Salary += (workHours - dayOff.Hours) * rate; } } } else if (holidays.Any(e => e.HolidayDate.Date == current.Date && !e.ToDoDate.HasValue)) { response.Salary += workHours * rate; } } } return(response); } private SalaryResponse CalculateOtherPayments(SalaryResponse calculatedSalary, DateTime start, DateTime end) { IQueryable <OtherPayment> otherPayments = _otherPaymentsRepository.GetByPersonIdAndDateRange(calculatedSalary.PersonId, start, end); foreach (OtherPayment otherPayment in otherPayments) { calculatedSalary.Salary += otherPayment.Value; } return(calculatedSalary); }
public override async Task <BaseResponse> AddAsync(MotivationModificatorData request, ServerCallContext context) { try { if (request is null) { await _motivationModificatorRepository.AddAsync(null); } MotivationModificator motivationModificator = FromRpcModel(request); int result = await _motivationModificatorRepository.AddAsync(motivationModificator); if (result == 0) { throw new Exception("Motivation modificator has not been saved"); } BaseResponse response = new() { Code = Code.Success, DataId = motivationModificator.Id, ErrorMessage = string.Empty }; LogData logData = new() { CallSide = nameof(MotivationModificatorsService), CallerMethodName = nameof(AddAsync), CreatedOn = _dateTimeUtil.GetCurrentDateTime(), Request = request, Response = response }; _logger.AddLog(logData); return(response); } catch (NullReferenceException nrex) { LogData logData = new() { CallSide = nameof(MotivationModificatorsService), CallerMethodName = nameof(AddAsync), CreatedOn = _dateTimeUtil.GetCurrentDateTime(), Request = request, Response = nrex }; _logger.AddErrorLog(logData); return(new BaseResponse { Code = Code.DataError, ErrorMessage = nrex.Message }); } catch (ArgumentException aex) { LogData logData = new() { CallSide = nameof(MotivationModificatorsService), CallerMethodName = nameof(AddAsync), CreatedOn = _dateTimeUtil.GetCurrentDateTime(), Request = request, Response = aex }; _logger.AddErrorLog(logData); return(new BaseResponse { Code = Code.DataError, ErrorMessage = aex.Message }); } catch (InvalidOperationException ioex) { LogData logData = new() { CallSide = nameof(MotivationModificatorsService), CallerMethodName = nameof(AddAsync), CreatedOn = _dateTimeUtil.GetCurrentDateTime(), Request = request, Response = ioex }; _logger.AddErrorLog(logData); return(new BaseResponse { Code = Code.DataError, ErrorMessage = ioex.Message }); } catch (DbUpdateException duex) { LogData logData = new() { CallSide = nameof(MotivationModificatorsService), CallerMethodName = nameof(AddAsync), CreatedOn = _dateTimeUtil.GetCurrentDateTime(), Request = request, Response = duex }; _logger.AddErrorLog(logData); return(new BaseResponse { Code = Code.DbError, ErrorMessage = "An error occured while saving motivation modificator" }); } catch (Exception ex) { LogData logData = new() { CallSide = nameof(MotivationModificatorsService), CallerMethodName = nameof(AddAsync), CreatedOn = _dateTimeUtil.GetCurrentDateTime(), Request = request, Response = ex }; _logger.AddErrorLog(logData); return(new BaseResponse { Code = Code.UnknownError, ErrorMessage = ex.Message }); } }