Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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");
        }
Ejemplo n.º 3
0
 private static MotivationModificatorData ToRpcModel(MotivationModificator motivationModificator)
 {
     return(new MotivationModificatorData
     {
         Id = motivationModificator.Id,
         StaffId = motivationModificator.StaffId,
         ModValue = motivationModificator.ModValue,
         CreatedOn = Timestamp.FromDateTime(motivationModificator.CreatedOn)
     });
 }
Ejemplo n.º 4
0
 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());
 }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
 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");
     }
 }
Ejemplo n.º 7
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));
        }
Ejemplo n.º 8
0
        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);
        }
Ejemplo n.º 9
0
 public virtual async Task <int> UpdateAsync(MotivationModificator modificator)
 {
     CheckData(modificator);
     _context.MotivationModificators.Update(modificator);
     return(await _context.SaveChangesAsync());
 }
Ejemplo n.º 10
0
        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);
        }
Ejemplo n.º 11
0
        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
                });
            }
        }