protected override void AdditionalSetup()
        {
            _mockUserInteraction = new Mock <ICustomUserInteraction>();
            Ioc.RegisterSingleton <ICustomUserInteraction>(_mockUserInteraction.Object);

            _mockMessenger = new Mock <IMvxMessenger>();
            Ioc.RegisterSingleton <IMvxMessenger>(_mockMessenger.Object);

            _fixture = new Fixture().Customize(new AutoMoqCustomization());
            _fixture.OmitProperty("EffectiveDateString");
            _fixture.Customize <InstructionSafetyCheckViewModel>(vm => vm.Without(x => x.SafetyCheckItemViewModels));
            _fixture.Customize <InstructionSafetyCheckViewModel>(vm => vm.Without(x => x.SafetyProfileVehicle));
            _fixture.Customize <SafetyCheckFault>(vm => vm.With(x => x.Status, Core.Enums.SafetyCheckStatus.Passed));

            _driver  = _fixture.Create <Core.Models.Driver>();
            _vehicle = _fixture.Create <Core.Models.Vehicle>();
            _trailer = _fixture.Create <Core.Models.Trailer>();

            _infoService = _fixture.Create <InfoService>();
            _fixture.Inject <IInfoService>(_infoService);
            _infoService.SetCurrentDriver(_driver);
            _infoService.SetCurrentVehicle(_vehicle);

            _safetyCheckService = _fixture.Create <SafetyCheckService>();
            _fixture.Inject <ISafetyCheckService>(_safetyCheckService);

            _mobileData = _fixture.SetUpInstruction(Core.Enums.InstructionType.Collect, false, true, false, false, false, false, true, null);
            _navData    = new NavData <MobileData>()
            {
                Data = _mobileData
            };

            _navData.OtherData["UpdatedTrailer"] = _trailer;

            _safetyCheckService.CurrentVehicleSafetyCheckData   = _vehicleSafetyCheckData = _fixture.Create <SafetyCheckData>();
            _navData.OtherData["UpdatedTrailerSafetyCheckData"] = _trailerSafetyCheckData = _fixture.Create <SafetyCheckData>();

            var mockMobileDataRepo = _fixture.InjectNewMock <IMobileDataRepository>();

            mockMobileDataRepo.Setup(mdr => mdr.GetByIDAsync(It.Is <Guid>(i => i == _mobileData.ID))).ReturnsAsync(_mobileData);

            _mockSafetyProfileRepository = _fixture.InjectNewMock <ISafetyProfileRepository>();
            _mockConfigRepository        = _fixture.InjectNewMock <IConfigRepository>();
            _mockVehicleRepo             = _fixture.InjectNewMock <IVehicleRepository>();

            _mockVehicleRepo.Setup(vr => vr.GetByIDAsync(_vehicle.ID)).ReturnsAsync(_vehicle);

            var repositories = _fixture.Create <Repositories>();

            _fixture.Inject <IRepositories>(repositories);

            _mockNavigationService = _fixture.InjectNewMock <INavigationService>();
            Ioc.RegisterSingleton <INavigationService>(_mockNavigationService.Object);

            _safetyProfiles = CreateSafetyProfiles();
        }
        protected async Task <SafetyCheckData> GenerateSafetyCheckDataAsync(SafetyProfile safetyProfile, Guid driverID, Guid vehicleOrTrailerID, string vehicleOrTrailerRegistration, bool isTrailer)
        {
            var faults = safetyProfile.Children
                         .OrderBy(scft => scft.Order)
                         .Select(scft => new Models.SafetyCheckFault
            {
                SafetyCheckDataID       = safetyProfile.ID,
                Title                   = scft.Title,
                FaultTypeID             = scft.ID,
                IsDiscretionaryQuestion = scft.IsDiscretionaryQuestion,
            })
                         .ToList();

            var driver = await _repositories.DriverRepository.GetByIDAsync(driverID);

            // Set up the safety check data to be set in the startup service.
            // This is the result of the safety check which will be sent to bluesphere
            // and persisted locally in case the safety check needs to be shown by the driver.
            var safetyCheckData = new SafetyCheckData
            {
                ProfileIntLink      = safetyProfile.IntLink,
                DriverID            = driverID,
                DriverTitle         = driver.Title,
                VehicleID           = vehicleOrTrailerID,
                VehicleRegistration = vehicleOrTrailerRegistration,
                Faults    = faults,
                IsTrailer = isTrailer
            };

            // Add the safety check item view models
            foreach (var fault in faults)
            {
                this.SafetyCheckItemViewModels.Add(new SafetyCheckItemViewModel(this, _navigationService)
                {
                    ID = fault.ID,
                    SafetyCheckFault        = fault,
                    IsVehicle               = !isTrailer,
                    Title                   = (isTrailer ? "TRL: " : "VEH: ") + fault.Title,
                    IsDiscretionaryQuestion = fault.IsDiscretionaryQuestion,
                    CheckStatus             = fault.Status,
                });
            }

            RaisePropertyChanged(() => this.SafetyCheckItemViewModels);

            return(safetyCheckData);
        }
Exemple #3
0
        public async Task CommitSafetyCheckDataAsync(bool trailerOnly = false)
        {
            // Add the safety checks to the gateway queue
            var safetyCheckData = this.GetCurrentSafetyCheckData();

            var safetyCheckFailed = false;

            // Store the latest safety check so the driver can display it at a later point if required
            var latestSafetyCheck = new LatestSafetyCheck {
                DriverID = _infoService.CurrentDriverID.Value
            };

            if (safetyCheckData.Any())
            {
                var overallStatus = SafetyCheckData.GetOverallStatus(safetyCheckData.Select(scd => scd.GetOverallStatus()));
                safetyCheckFailed = overallStatus == Enums.SafetyCheckStatus.Failed;

                // Submit the safety checks to the gateway service
                var smp = _gpsService.GetSmpData(Enums.ReportReason.SafetyReport);

                // Don't include milliseconds in the EffectiveDate submitted to BlueSphere
                var effectiveDateTime = DateTime.Now;
                effectiveDateTime = effectiveDateTime.AddMilliseconds(-effectiveDateTime.Millisecond);

                if (this.CurrentVehicleSafetyCheckData != null && this.CurrentVehicleSafetyCheckData.Faults.Any())
                {
                    latestSafetyCheck.VehicleSafetyCheck = this.CurrentVehicleSafetyCheckData;

                    if (!trailerOnly)
                    {
                        latestSafetyCheck.VehicleSafetyCheck.EffectiveDate = effectiveDateTime;
                    }
                }

                if (this.CurrentTrailerSafetyCheckData != null && this.CurrentTrailerSafetyCheckData.Faults.Any())
                {
                    latestSafetyCheck.TrailerSafetyCheck = this.CurrentTrailerSafetyCheckData;
                    latestSafetyCheck.TrailerSafetyCheck.EffectiveDate = effectiveDateTime;
                }

                await _repositories.LatestSafetyCheckRepository.SetForDriverAsync(latestSafetyCheck);

                // Submit the safety check data to BlueSphere
                var safetyCheckDataToSubmit = new List <SafetyCheckData>(safetyCheckData.Count());

                foreach (var scd in safetyCheckData)
                {
                    if (trailerOnly && !scd.IsTrailer)
                    {
                        continue;
                    }

                    var safetyCheck = Models.SafetyCheckData.ShallowCopy(scd);

                    // Passed safety check items shouldn't be submitted to the gateway service, only Fails and Discretionary Passes.
                    safetyCheck.Faults = scd.Faults.Where(scf => scf.Status != Enums.SafetyCheckStatus.Passed).ToList();

                    // Add the SMP, mileage and effective-date to the safety check
                    safetyCheck.SMP           = smp;
                    safetyCheck.Mileage       = _infoService.Mileage;
                    safetyCheck.EffectiveDate = effectiveDateTime;

                    safetyCheckDataToSubmit.Add(safetyCheck);
                }

                if (safetyCheckDataToSubmit.Any())
                {
                    var actions = safetyCheckDataToSubmit.Select(scd => new Models.GatewayServiceRequest.Action <Models.SafetyCheckData> {
                        Command = "fwSetSafetyCheckData", Data = scd
                    });
                    await _gatewayQueuedService.AddToQueueAsync(actions);
                }
            }
            else
            {
                await _repositories.LatestSafetyCheckRepository.SetForDriverAsync(latestSafetyCheck);
            }
        }