예제 #1
0
        public IHttpActionResult CreateByPattern([FromBody] CreatePersonnelShiftByPatternDto
                                                 personnelShift)
        {
            if (personnelShift == null)
            {
                return(BadRequest());
            }
            //custom validations
            var validator = new CreatePersonnelShiftByPatternDtoValidator();
            var results   = validator.Validate(personnelShift);

            if (!results.IsValid)
            {
                foreach (var failure in results.Errors)
                {
                    ModelState.AddModelError(failure.PropertyName, failure.ErrorMessage);
                }
            }
            if (!ModelState.IsValid)
            {
                string errorMessage = new ModelStateError(_logger).OutputMessage(ModelState);
                return(BadRequest(errorMessage));
            }
            try
            {
                var result = _personnelShiftService.CreateByPattern(personnelShift);
                if (!result.IsValid)
                {
                    return(BadRequest(result.Message));
                }
            }
            catch (LogicalException ex)
            {
                return(BadRequest(ex.Message));
            }
            catch
            {
                return(BadRequest(AppSettings.INTERNAL_SERVER_ERROR_MESSAGE));
            }
            return(Ok());
        }
        public CustomResult CreateByPattern(CreatePersonnelShiftByPatternDto dto)
        {
            if (dto.DaysOfWeek.Count == 0 && !dto.RepeatPattern.HasValue)
            {
                return(new CustomResult
                {
                    Message = "please choose repeat pattern or days of week"
                });
            }
            if (dto.PersonnelIdList.Count == 0)
            {
                return(new CustomResult
                {
                    Message = "please choose the personnel"
                });
            }
            foreach (var personnelId in dto.PersonnelIdList)
            {
                var shiftAssignments = new List <PersonnelShiftAssignment>();

                //build assignments
                var fromDate = dto.FromDate;
                var toDate   = dto.ToDate;

                if (dto.RepeatPattern.HasValue) //check repeat patterns
                {
                    switch (dto.RepeatPattern)
                    {
                    case RepeatPattern.EveryDay:
                        shiftAssignments = BuildPattern(fromDate, toDate, dto.IncludeFridays
                                                        , dto.IncludeHolidays, 1);
                        break;

                    case RepeatPattern.OneDayAfter:
                        shiftAssignments = BuildPattern(fromDate, toDate, dto.IncludeFridays
                                                        , dto.IncludeHolidays, 2);
                        break;

                    case RepeatPattern.TowDaysAfter:
                        shiftAssignments = BuildPattern(fromDate, toDate, dto.IncludeFridays
                                                        , dto.IncludeHolidays, 3);
                        break;

                    case RepeatPattern.WeekAfter:
                        shiftAssignments = BuildPattern(fromDate, toDate, dto.IncludeFridays
                                                        , dto.IncludeHolidays, 7);
                        break;

                    case RepeatPattern.TwoWeeksAfter:
                        shiftAssignments = BuildPattern(fromDate, toDate, dto.IncludeFridays
                                                        , dto.IncludeHolidays, 14);
                        break;

                    default:
                        break;
                    }
                }
                else if (dto.DaysOfWeek.Count > 0) //check day of week
                {
                    for (DateTime date = fromDate; date <= toDate; date = date.AddDays(1))
                    {
                        if (dto.DaysOfWeek.Contains(date.DayOfWeek))
                        {
                            if (!dto.IncludeFridays && date.DayOfWeek == DayOfWeek.Friday)
                            {
                                continue;
                            }
                            if (!dto.IncludeHolidays && _calendarDateService.IsHoliday(date))
                            {
                                continue;
                            }
                            shiftAssignments.Add(new PersonnelShiftAssignment
                            {
                                Date = date.Date
                            });
                        }
                    }
                }
                //check for same exists
                if (AnotherShiftForSameDayExists(personnelId, shiftAssignments))
                {
                    return(new CustomResult
                    {
                        Message = "cannot add another shift for the same day"
                    });
                }
                if (shiftAssignments.Count > 0)
                {
                    //save personnel shift
                    var personnelShift = new PersonnelShift
                    {
                        PersonnelId  = personnelId,
                        ShiftId      = dto.ShiftId,
                        DateAssigned = DateTime.Now
                    };
                    _personnelShiftRepository.Insert(personnelShift);

                    //save shift assignments
                    foreach (var personnelShiftAssignment in shiftAssignments)
                    {
                        personnelShiftAssignment.PersonnelShiftId = personnelShift.Id;
                        _personnelShiftAssignmentRepository.Insert(personnelShiftAssignment);
                    }
                }
                else
                {
                    return(new CustomResult
                    {
                        Message = "according to your filtering choices, could not assign shifts"
                    });
                }
            }
            return(new CustomResult
            {
                IsValid = true
            });
        }