예제 #1
0
        public async Task CanFilterByPropertyRef()
        {
            // Arrange
            var expectedPropertyRef = Guid.NewGuid().ToString();

            var allWorkOrders = _generator.GenerateList(3);

            SetPropertyRefs(allWorkOrders, "not" + expectedPropertyRef);

            var expectedWorkOrders = _generator.GenerateList(3);

            SetPropertyRefs(expectedWorkOrders, expectedPropertyRef);

            allWorkOrders.AddRange(expectedWorkOrders);

            _repairsMock.ReturnsWorkOrders(allWorkOrders);

            var workOrderSearchParameters = new WorkOrderSearchParameters
            {
                PropertyReference = expectedPropertyRef
            };

            // Act
            var workOrders = await _classUnderTest.Execute(workOrderSearchParameters);

            // Assert
            workOrders.Should().BeEquivalentTo(expectedWorkOrders);
        }
        public async Task ListsWorkOrders()
        {
            const int count        = 5;
            var       index        = new Random().Next(0, count - 1);
            var       operatives   = _fixture.CreateMany <WorkOrderOperativeResponse>(count);
            var       operativePrn = operatives.ElementAt(index).PayrollNumber;

            var expectedWorkOrders   = _fixture.CreateMany <OperativeWorkOrderListItem>();
            var expectedSearchParams = new WorkOrderSearchParameters
            {
                OperativePRNs = new List <string>
                {
                    operativePrn
                }
            };

            _listOperativeWorkOrdersMock
            .Setup(m => m.Execute(It.IsAny <OperativeWorkOrderSearch>()))
            .ReturnsAsync(expectedWorkOrders);

            var objectResult = await _classUnderTest.ListWorkOrders(operativePrn);

            var workOrderResponse = GetResultData <List <OperativeWorkOrderListItem> >(objectResult);
            var statusCode        = GetStatusCode(objectResult);

            // Assert
            statusCode.Should().Be((int)HttpStatusCode.OK);
            workOrderResponse.Should().BeEquivalentTo(expectedWorkOrders);
        }
예제 #3
0
        public async Task ReturnsCorrectPageOfWorkOrders()
        {
            //Arrange
            const int workOrderCount            = 50;
            const int expectedPageSize          = 10;
            var       generatedWorkOrders       = GenerateAndReturnWorkOrdersWithRandomStatus(workOrderCount);
            var       workOrderSearchParameters = new WorkOrderSearchParameters
            {
                PageNumber = 2,
                PageSize   = expectedPageSize
            };
            var statusOrder = new[] {
                WorkStatusCode.Open,
                WorkStatusCode.VariationPendingApproval,
                WorkStatusCode.Canceled,
                WorkStatusCode.Complete
            };

            //Act
            var workOrders = await _classUnderTest.Execute(workOrderSearchParameters);

            //Assert
            var expectedResult = generatedWorkOrders
                                 .OrderBy(wo => Array.IndexOf(statusOrder, wo.StatusCode))
                                 .ThenByDescending(wo => wo.DateRaised)
                                 .Skip((workOrderSearchParameters.PageNumber - 1) * workOrderSearchParameters.PageSize)
                                 .Take(workOrderSearchParameters.PageSize);

            workOrders.Should().BeEquivalentTo(expectedResult);
        }
예제 #4
0
        public async Task <IEnumerable <OperativeWorkOrderListItem> > Execute(OperativeWorkOrderSearch opSearch)
        {
            var loggedInUser = _currentUserService.GetUser();

            if (!string.Equals(loggedInUser.PayrollNumber(), opSearch.PayrollNumber, StringComparison.CurrentCultureIgnoreCase))
            {
                ThrowHelper.ThrowUnauthorizedAccessException("Only the operative can retrieve their list of work orders.");
            }

            var operativeDashActiveStatusCodes = Enum.GetValues(typeof(WorkStatusCode)).Cast <int>().ToList();

            operativeDashActiveStatusCodes.RemoveAll(c => c == (int)WorkStatusCode.Canceled ||
                                                     c == (int)WorkStatusCode.PendingApproval);

            _logger.LogInformation($"Searching for operative number {opSearch.PayrollNumber} work orders with statuses {string.Join(", ", operativeDashActiveStatusCodes.Select(x => x.ToString()))}");

            var searchParams = new WorkOrderSearchParameters
            {
                StartDate     = DateTime.Today,
                EndDate       = DateTime.Today.AddDays(1),
                OperativePRNs = new List <string>
                {
                    opSearch.PayrollNumber
                },
                StatusCode = operativeDashActiveStatusCodes,
                PageSize   = opSearch.PageSize
            };
            var workOrders = await _listWorkOrdersUseCase.Execute(searchParams);

            if (!workOrders.Any())
            {
                _logger.LogWarning($"Search for work orders for operative {opSearch.PayrollNumber} did not find anything");
            }
            else
            {
                _logger.LogInformation($"{workOrders.Count()} work orders for operative {opSearch.PayrollNumber}: [${string.Join(", ", workOrders.Select(w => w.Id.ToString()))}]");
            }

            DateTime earliestAppointementDate = GetEarliestAppointmentFromWorkOrders(workOrders);

            var excludedWorkOrders = workOrders.Where(wo =>
                                                      (wo.StatusCode == WorkStatusCode.Complete && wo.ClosedDate.Value.Date < earliestAppointementDate.Date ||
                                                       wo.StatusCode == WorkStatusCode.NoAccess && wo.ClosedDate.Value.Date < earliestAppointementDate.Date
                                                      ));

            workOrders = workOrders
                         .Except(excludedWorkOrders);

            workOrders = workOrders.OrderBy(wo => wo.Appointments.Min(a => a.StartTime));

            return(workOrders.Select(wo => wo.ToOperativeListItem()));
        }
예제 #5
0
        private async Task <IEnumerable <WorkOrder> > GetWorkOrdersFromToday()
        {
            var todaysJobsParams = new WorkOrderSearchParameters
            {
                StartDate = DateTime.Today,
                EndDate   = DateTime.Today.AddDays(1),
                PageSize  = 0
            };

            return((await _listWorkOrdersUseCase.Execute(todaysJobsParams))
                   .Where(wo => wo.StatusCode != WorkStatusCode.Complete)
                   .Where(wo => !wo.HasManuallyAssignedOperatives()));
        }
예제 #6
0
        private static IEnumerable <WorkOrder> EnsureSorting(WorkOrderSearchParameters searchParameters, IEnumerable <WorkOrder> workOrders)
        {
            var statusOrders = new[]
            {
                WorkStatusCode.Open, WorkStatusCode.VariationPendingApproval, WorkStatusCode.Canceled, WorkStatusCode.Complete
            };

            if (!IsSortSpecified(searchParameters))
            {
                workOrders = AddDefaultSort(workOrders, statusOrders);
            }

            return(workOrders);
        }
예제 #7
0
        public async Task <IEnumerable <WorkOrder> > Execute(WorkOrderSearchParameters searchParameters)
        {
            var filter     = _filterBuilder.BuildFilter(searchParameters);
            var workOrders = await _repairsGateway.GetWorkOrders(filter, searchParameters.IncludeHistorical);

            workOrders = EnsureSorting(searchParameters, workOrders);

            if (searchParameters.PageSize == 0)
            {
                return(workOrders);
            }

            return(workOrders
                   .Skip((searchParameters.PageNumber - 1) * searchParameters.PageSize)
                   .Take(searchParameters.PageSize));
        }
예제 #8
0
        private async Task <IEnumerable <WorkOrder> > GetHistoricalWorkOrders()
        {
            var searchParams = new WorkOrderSearchParameters
            {
                StartDate = DateTime.Today.AddDays(1),
                EndDate   = DateTime.Today.AddDays(30),
                PageSize  = 0
            };

            var workOrders = await _listWorkOrdersUseCase.Execute(searchParams);

            return(workOrders
                   .Where(wo => wo.StatusCode != WorkStatusCode.Complete)
                   .Where(wo => !wo.HasManuallyAssignedOperatives())
                   .OrderBy(wo => wo.Appointments.Min(appt => appt.StartTime)));
        }
예제 #9
0
        public async Task ReturnsAllWorkOrdersWhenPageSizeIsZero()
        {
            //Arrange
            const int workOrderCount = 50;

            GenerateAndReturnWorkOrdersWithRandomStatus(workOrderCount);
            var workOrderSearchParameters = new WorkOrderSearchParameters
            {
                PageSize = 0
            };

            //Act
            var workOrders = await _classUnderTest.Execute(workOrderSearchParameters);

            //Assert
            workOrders.Should().HaveCount(workOrderCount);
        }
        public async Task FiltersWorkOrders()
        {
            // Arrange
            CreateWorkOrders();

            var expectedSearchParams = new WorkOrderSearchParameters
            {
                StartDate = DateTime.Today.AddDays(1),
                EndDate   = DateTime.Today.AddDays(30)
            };

            // Act
            await _classUnderTest.ExecuteAsync();

            // Assert
            _listWorkOrdersMock.Verify(x => x.Execute(It.Is <WorkOrderSearchParameters>(wosp =>
                                                                                        wosp.StartDate == expectedSearchParams.StartDate &&
                                                                                        wosp.EndDate == expectedSearchParams.EndDate &&
                                                                                        wosp.PageSize == 0
                                                                                        )));
        }
 private static bool ValidateExclusions(WorkOrderSearchParameters sp)
 {
     return(!sp.StatusCode.Contains((int)WorkStatusCode.Canceled) &&
            !sp.StatusCode.Contains((int)WorkStatusCode.PendingApproval));
 }
 private static bool ValidateSearchParams(string expectedPRN, WorkOrderSearchParameters sp)
 {
     return(sp.OperativePRNs.Contains(expectedPRN) &&
            sp.StartDate == DateTime.Today &&
            sp.EndDate == DateTime.Today.AddDays(1));
 }
 public void Setup()
 {
     _classUnderTest = new WorkOrderSearchParameters();
 }
예제 #14
0
        public async Task <IActionResult> GetList([FromQuery] WorkOrderSearchParameters parameters)
        {
            var workOrders = await _listWorkOrdersUseCase.Execute(parameters);

            return(Ok(workOrders.Select(wo => wo.ToListItem()).ToList()));
        }
예제 #15
0
 private static bool IsSortSpecified(WorkOrderSearchParameters searchParameters)
 {
     return(!string.IsNullOrWhiteSpace(searchParameters.Sort));
 }