Пример #1
0
            public async Task AddLoadStatusTransaction()
            {
                var inTransitStatus = new LoadStatusInTransitData
                {
                    LoadId       = VALID_LOAD_ID,
                    LocationTime = new DateTimeOffset(new DateTime(2020, 2, 11, 10, 0, 0)),
                    //Oregon
                    Latitude  = 46.161605m,
                    Longitude = -123.414906m
                };

                _carrierWebApiService.Setup(_ => _.Send <InTransitLoadData>(It.IsAny <LoadStatusEvent <InTransitLoadData> >()))
                .ReturnsAsync(new LoadStatusEvent <CarrierApiResponseMessages>
                {
                    MessageId   = Guid.Parse("44444444-4444-4444-4444-555555555555"),
                    MessageTime = new DateTimeOffset(new DateTime(2020, 2, 11, 12, 13, 14))
                });

                _svc = CreateService();

                var response = await _svc.AddInTransitStatus(inTransitStatus);

                response.IsSuccess.Should().BeTrue();

                _dbBuilder.MockLoadStatusTransactions.Verify(_ => _.Add(It.Is <LoadStatusTransactionEntity>(x =>
                                                                                                            x.MessageId == Guid.Parse("44444444-4444-4444-4444-555555555555") &&
                                                                                                            x.MessageTime == new DateTimeOffset(new DateTime(2020, 2, 11, 12, 13, 14)) &&
                                                                                                            x.LoadId == VALID_LOAD_ID
                                                                                                            //can't verity the TransactionDtTm since it's using DateTime.Now
                                                                                                            )));
            }
Пример #2
0
        /// <summary>
        /// Adds in transit status if most recent event was a departure
        /// </summary>
        /// <param name="stopData"></param>
        /// <param name="load"></param>
        /// <returns></returns>
        public async Task <LoadStatusInTransitData> AddInTransitStopStatus(LoadStatusStopData stopData, LoadEntity load)
        {
            var mostRecentStop = stopData?.Events?.OrderBy(x => x.StopNumber).LastOrDefault();

            if (mostRecentStop?.EventType == StopEventTypeEnum.Departure)
            {
                var mostRecentLoadStop = load?.LoadStops?.FirstOrDefault(_ => _.StopNbr == mostRecentStop.StopNumber);
                if (mostRecentLoadStop != null)
                {
                    var inTransitStopData = new LoadStatusInTransitData()
                    {
                        LoadId       = load.LoadId,
                        LocationTime = mostRecentStop.EventTime,
                        // https://kbxltrans.visualstudio.com/Suite/_workitems/edit/40298
                        Latitude  = mostRecentLoadStop.Latitude,
                        Longitude = mostRecentLoadStop.Longitude
                    };

                    await AddInTransitStatus(inTransitStopData);

                    return(inTransitStopData);
                }
            }

            return(null);
        }
Пример #3
0
            public async Task SubmitsCorrectInTransitTime()
            {
                var inTransitStatus = new LoadStatusInTransitData
                {
                    LoadId       = VALID_LOAD_ID,
                    LocationTime = new DateTimeOffset(new DateTime(2020, 2, 11, 10, 0, 0)),
                    //Oregon
                    Latitude  = 46.161605m,
                    Longitude = -123.414906m
                };

                _carrierWebApiService.Setup(_ => _.Send <InTransitLoadData>(It.IsAny <LoadStatusEvent <InTransitLoadData> >()))
                .ReturnsAsync(new LoadStatusEvent <CarrierApiResponseMessages>
                {
                    MessageId   = Guid.Parse("44444444-4444-4444-4444-555555555555"),
                    MessageTime = new DateTimeOffset(new DateTime(2020, 2, 11, 12, 13, 14))
                });

                _svc = CreateService();

                var response = await _svc.AddInTransitStatus(inTransitStatus);

                response.IsSuccess.Should().BeTrue();

                _carrierWebApiService.Verify(_ => _.Send <InTransitLoadData>(It.Is <LoadStatusEvent <InTransitLoadData> >(
                                                                                 e => e.MessageType == "LoadLocation" &&
                                                                                 e.ApiVersion == "1.1" &&
                                                                                 e.Payload.Loads[0].LoadNumber == VALID_REF_LOAD_ID &&
                                                                                 e.Payload.Loads[0].Latitude == 46.161605m &&
                                                                                 e.Payload.Loads[0].Longitude == -123.414906m &&
                                                                                 e.Payload.Loads[0].LocationTime == "2020-02-11T10:00:00" &&
                                                                                 e.Payload.Loads[0].IsLocalTime == true
                                                                                 )));
            }
Пример #4
0
            public async Task PreventsFutureTimeForTimeZone()
            {
                var inTransitStatus = new LoadStatusInTransitData
                {
                    LoadId       = VALID_LOAD_ID,
                    LocationTime = new DateTimeOffset(DateTime.Now),//Assuming this is central time
                    //Oregon
                    Latitude  = 46.161605m,
                    Longitude = -123.414906m
                };

                _carrierWebApiService.Setup(_ => _.Send <InTransitLoadData>(It.IsAny <LoadStatusEvent <InTransitLoadData> >()))
                .ReturnsAsync(new LoadStatusEvent <CarrierApiResponseMessages>
                {
                    MessageId   = Guid.Parse("44444444-4444-4444-4444-555555555555"),
                    MessageTime = new DateTimeOffset(new DateTime(2020, 2, 11, 12, 13, 14))
                });

                _svc = CreateService();

                var response = await _svc.AddInTransitStatus(inTransitStatus);

                response.IsSuccess.Should().BeFalse();
                AssertHasError(response, $"urn:root:LocationTime", "Status Date/Time must be in the past");
            }
Пример #5
0
            public async Task LoadNotAcceptedOrPending()
            {
                var inTransitStatus = new LoadStatusInTransitData
                {
                    LoadId = UNBOOKED_LOAD_ID
                };

                _svc = CreateService();

                Func <Task> action = async() => await _svc.AddInTransitStatus(inTransitStatus);

                (await action.Should().ThrowAsync <Exception>()).WithMessage("Load not accepted");
            }
Пример #6
0
            public async Task LoadNotFound()
            {
                var inTransitStatus = new LoadStatusInTransitData
                {
                    LoadId = INVALID_LOAD_ID
                };

                _svc = CreateService();

                Func <Task> action = async() => await _svc.AddInTransitStatus(inTransitStatus);

                (await action.Should().ThrowAsync <Exception>()).WithMessage("Load not found");
            }
Пример #7
0
            public async Task SubmitsBillingLoadId()
            {
                var load = VALID_LOAD;

                load.PlatformPlusLoadId = "PLATFORM_PLUS_ID";
                load.LatestLoadTransaction.Claim.BillingLoadId = "BILLING_LOAD_ID";
                var loads = new List <LoadEntity> {
                    load
                };

                _dbBuilder = new MockDbBuilder();
                _db        = _dbBuilder
                             .WithLoads(loads)
                             .WithUsers(new List <UserEntity> {
                    VALID_CARRIER_USER
                })
                             .Build();

                var inTransitStatus = new LoadStatusInTransitData
                {
                    LoadId       = VALID_LOAD_ID,
                    LocationTime = new DateTimeOffset(new DateTime(2020, 2, 11, 10, 0, 0)),
                    //Oregon
                    Latitude  = 46.161605m,
                    Longitude = -123.414906m
                };

                _carrierWebApiService.Setup(_ => _.Send <InTransitLoadData>(It.IsAny <LoadStatusEvent <InTransitLoadData> >()))
                .ReturnsAsync(new LoadStatusEvent <CarrierApiResponseMessages>
                {
                    MessageId   = Guid.Parse("44444444-4444-4444-4444-555555555555"),
                    MessageTime = new DateTimeOffset(new DateTime(2020, 2, 11, 12, 13, 14))
                });

                _svc = CreateService();

                var response = await _svc.AddInTransitStatus(inTransitStatus);

                response.IsSuccess.Should().BeTrue();

                _carrierWebApiService.Verify(_ => _.Send <InTransitLoadData>(It.Is <LoadStatusEvent <InTransitLoadData> >(
                                                                                 e => e.MessageType == "LoadLocation" &&
                                                                                 e.ApiVersion == "1.1" &&
                                                                                 e.Payload.Loads[0].LoadNumber == "BILLING_LOAD_ID" &&
                                                                                 e.Payload.Loads[0].Latitude == 46.161605m &&
                                                                                 e.Payload.Loads[0].Longitude == -123.414906m &&
                                                                                 e.Payload.Loads[0].LocationTime == "2020-02-11T10:00:00" &&
                                                                                 e.Payload.Loads[0].IsLocalTime == true
                                                                                 )));
            }
Пример #8
0
            public async Task UserHasWrongPrimaryScac()
            {
                var inTransitStatus = new LoadStatusInTransitData
                {
                    LoadId = VALID_LOAD_ID
                };

                _userContext.SetupGet(_ => _.UserId).Returns(INVALID_USER_ID);

                _svc = CreateService();

                Func <Task> action = async() => await _svc.AddInTransitStatus(inTransitStatus);

                (await action.Should().ThrowAsync <Exception>()).WithMessage("Load not found");
            }
Пример #9
0
            public async Task LocationLongitudeIsNull()
            {
                var inTransitStatus = new LoadStatusInTransitData
                {
                    LoadId       = VALID_LOAD_ID,
                    LocationTime = new DateTimeOffset(new DateTime(2020, 2, 11, 10, 0, 0)),
                    Latitude     = 0,
                    Longitude    = null
                };

                _svc = CreateService();

                var response = await _svc.AddInTransitStatus(inTransitStatus);

                response.IsSuccess.Should().BeFalse();
                AssertHasError(response, $"urn:root:Longitude", "Location is required");
            }
Пример #10
0
            public async Task LocationIsNull()
            {
                var inTransitStatus = new LoadStatusInTransitData
                {
                    LoadId       = VALID_LOAD_ID,
                    LocationTime = null,
                    Latitude     = 0,
                    Longitude    = 0
                };

                _svc = CreateService();

                var response = await _svc.AddInTransitStatus(inTransitStatus);

                response.IsSuccess.Should().BeFalse();
                AssertHasError(response, $"urn:root:LocationTime", "Status Date/Time is required");
            }
Пример #11
0
        public async Task <IActionResult> PostInTransitStatus([FromBody] LoadStatusInTransitData inTransitStatus)
        {
            var response = await _loadStatusTransactionService.AddInTransitStatus(inTransitStatus);

            if (!response.IsSuccess)
            {
                var problemDetails = new ValidationProblemDetails(response.ModelState)
                {
                    Title    = "Send \"In Transit\" Status",
                    Detail   = "One or more errors occurred when trying to update the In Transit status of the load.  See form for error details",
                    Status   = (int)HttpStatusCode.BadRequest,
                    Instance = $"urn:kbxl:error:{Guid.NewGuid()}"
                };
                return(BadRequest(problemDetails));
            }

            var data = await _loadStatusTransactionService.GetLatestStatus(inTransitStatus.LoadId);

            return(Success(data));
        }
Пример #12
0
            public async Task UserDoesNotHaveAction()
            {
                var inTransitStatus = new LoadStatusInTransitData
                {
                    LoadId = VALID_LOAD_ID
                };

                _securityService.Setup(_ => _.UserHasActionAsync(It.IsAny <string[]>())).ReturnsAsync(false);

                _svc = CreateService();

                Func <Task> action = async() => await _svc.AddInTransitStatus(inTransitStatus);

                await action.Should().ThrowAsync <Exception>();

                _securityService.Verify(_ => _.UserHasActionAsync(It.Is <string[]>(actions =>
                                                                                   actions != null && actions.Length == 1 &&
                                                                                   actions[0] == SecurityActions.Loadshop_Ui_My_Loads_Status_Update
                                                                                   )));
            }
Пример #13
0
        public async Task <BaseServiceResponse> AddInTransitStatus(LoadStatusInTransitData inTransitData)
        {
            await _securityService.GuardActionAsync(SecurityActions.Loadshop_Ui_My_Loads_Status_Update);

            var(load, scac) = await GetLoadAndScac(inTransitData.LoadId, includeStops : false);

            //Adjust the time if it's close to current
            bool inFuture;

            (inTransitData.LocationTime, inFuture) = AdjustLocationTime(inTransitData.LocationTime, inTransitData.Latitude, inTransitData.Longitude);

            var response = new BaseServiceResponse();

            if (inTransitData.LocationTime == null)
            {
                response.AddError($"urn:root:{nameof(LoadStatusInTransitData.LocationTime)}", "Status Date/Time is required");
            }
            else if (inFuture)
            {
                response.AddError($"urn:root:{nameof(LoadStatusInTransitData.LocationTime)}", "Status Date/Time must be in the past");
            }

            if (inTransitData.Latitude == null)
            {
                response.AddError($"urn:root:{nameof(LoadStatusInTransitData.Latitude)}", "Location is required");
            }
            else if (inTransitData.Longitude == null)
            {
                response.AddError($"urn:root:{nameof(LoadStatusInTransitData.Longitude)}", "Location is required");
            }

            if (!response.IsSuccess)
            {
                return(response);
            }

            var currentTime = DateTimeOffset.UtcNow;
            var lst         = new LoadStatusTransactionEntity
            {
                LoadId          = load.LoadId,
                TransactionDtTm = currentTime.DateTime//this may not be needed anymore if we can send the MessageTime
            };

            var eventResponse = await _carrierWebAPIService.Send(new LoadStatusEvent <InTransitLoadData>
            {
                MessageType = "LoadLocation",
                MessageId   = Guid.NewGuid(),
                MessageTime = DateTimeOffset.Now,
                ApiVersion  = "1.1",
                Payload     = new InTransitLoadData
                {
                    Loads = new InTransitEventData[]
                    {
                        new InTransitEventData
                        {
                            LoadNumber   = load.LatestLoadTransaction.Claim.BillingLoadId ?? load.PlatformPlusLoadId ?? load.ReferenceLoadId,
                            Latitude     = inTransitData.Latitude.Value,
                            Longitude    = inTransitData.Longitude.Value,
                            LocationTime = inTransitData.LocationTime?.ToString("yyyy-MM-ddTHH:mm:ss"),
                            IsLocalTime  = true, //Always true if in local status time
                            Scac         = scac
                        }
                    }
                }
            });

            lst.MessageId   = eventResponse.MessageId;
            lst.MessageTime = eventResponse.MessageTime;
            _context.LoadStatusTransactions.Add(lst);
            await _context.SaveChangesAsync(_userContext.UserName);

            return(response);
        }