Beispiel #1
0
        public async Task And_Has_ErrorCode_DLock07_And_TriageStatus_Unknown_Then_ILR_Data_mismatch_Alert(
            Apprenticeship source,
            DataLockStatus dataLockStatus,
            PriceHistory priceHistory,
            ApprenticeshipToApprenticeshipDetailsMapper mapper)
        {
            source.PriceHistory = new List <PriceHistory> {
                priceHistory
            };
            source.IsProviderSearch     = true;
            dataLockStatus.ErrorCode    = DataLockErrorCode.Dlock07;
            dataLockStatus.TriageStatus = TriageStatus.Unknown;
            dataLockStatus.IsResolved   = false;
            source.PriceHistory         = new List <PriceHistory> {
                priceHistory
            };
            source.DataLockStatus = new List <DataLockStatus> {
                dataLockStatus
            };
            source.ApprenticeshipUpdate = new List <ApprenticeshipUpdate>();

            var result = await mapper.Map(source);

            result.Alerts.Should().BeEquivalentTo(new List <Alerts> {
                Alerts.IlrDataMismatch
            });
        }
        public async Task ShouldNotUpdateApprenticeshipIfApprenticeshipHasHadSuccessDataLock()
        {
            var isDataLockWithCourse = new DataLockStatus {
                DataLockEventId = 1, ApprenticeshipId = _command.ApprenticeshipId, IsResolved = false, Status = Status.Fail, IlrTotalCost = 505,
                ErrorCode       = DataLockErrorCode.Dlock07 | DataLockErrorCode.Dlock03, IlrEffectiveFromDate = DateTime.Now, TriageStatus = TriageStatus.Change
            };

            var toBeUpdateDataLock = new DataLockStatus {
                DataLockEventId = 3, ApprenticeshipId = _command.ApprenticeshipId, IsResolved = false, Status = Status.Fail, IlrTotalCost = 400,
                ErrorCode       = DataLockErrorCode.Dlock07, IlrEffectiveFromDate = DateTime.Now.AddMonths(1), TriageStatus = TriageStatus.Change
            };


            _dataLockRepository.Setup(m => m.GetDataLocks(_command.ApprenticeshipId, false))
            .ReturnsAsync(new List <DataLockStatus> {
                isDataLockWithCourse, toBeUpdateDataLock
            });

            _apprenticeshipRepository.Setup(m => m.GetApprenticeship(_command.ApprenticeshipId))
            .ReturnsAsync(new Apprenticeship {
                CommitmentId = 123456L, HasHadDataLockSuccess = true
            });

            await _sut.Handle(_command);

            _dataLockRepository.Verify(m => m.ResolveDataLock(It.IsAny <IEnumerable <long> >()), Times.Once);


            _apprenticeshipTrainingService.Verify(m => m.GetTrainingProgramAsync(It.IsAny <string>(), false), Times.Never);
            _apprenticeshipRepository.Verify(m => m.UpdateApprenticeship(It.IsAny <Apprenticeship>(), new Caller()), Times.Never);
        }
 public static bool PreviousResolvedPriceDataLocks(this DataLockStatus dataLockStatus)
 {
     return(dataLockStatus.ErrorCode == DataLockErrorCode.Dlock07 &&
            dataLockStatus.Status == Status.Fail &&
            dataLockStatus.TriageStatus == TriageStatus.Change &&
            dataLockStatus.IsResolved);
 }
 public static DateTime GetDateFromPriceEpisodeIdentifier(this DataLockStatus dataLockStatus)
 {
     return(DateTime.ParseExact(
                dataLockStatus.PriceEpisodeIdentifier.Substring(dataLockStatus.PriceEpisodeIdentifier.Length - 10),
                "dd/MM/yyyy",
                new CultureInfo("en-GB")));
 }
 private void AssertDataLockBelongsToApprenticeship(long apprenticeshipId, DataLockStatus dataLockStatus)
 {
     if (apprenticeshipId != dataLockStatus.ApprenticeshipId)
     {
         throw new ValidationException($"Data lock {dataLockStatus.DataLockEventId} does not belong to Apprenticeship {apprenticeshipId}");
     }
 }
        private void ApplyErrorCodeWhiteList(DataLockStatus dataLockStatus)
        {
            var whitelisted = DataLockErrorCode.None;
            var skipped     = DataLockErrorCode.None;

            foreach (DataLockErrorCode errorCode in Enum.GetValues(typeof(DataLockErrorCode)))
            {
                if (dataLockStatus.ErrorCode.HasFlag(errorCode))
                {
                    if (_whiteList.Contains(errorCode))
                    {
                        whitelisted = whitelisted == DataLockErrorCode.None ? errorCode : whitelisted | errorCode;
                    }
                    else
                    {
                        skipped = skipped == DataLockErrorCode.None ? errorCode : skipped | errorCode;
                    }
                }
            }

            if (skipped != DataLockErrorCode.None)
            {
                _logger.Info($"Skipping {skipped}");
            }

            dataLockStatus.ErrorCode = whitelisted;
        }
Beispiel #7
0
        public async Task And_Provider_Has_Unresolved_Errors_That_Have_Known_Triage_Status(
            Apprenticeship source,
            DataLockStatus dataLockStatus,
            PriceHistory priceHistory,
            ApprenticeshipToApprenticeshipDetailsMapper mapper)
        {
            //Arrange
            dataLockStatus.Status       = Status.Fail;
            dataLockStatus.TriageStatus = TriageStatus.Restart;
            dataLockStatus.IsResolved   = false;
            source.IsProviderSearch     = true;
            source.PriceHistory         = new List <PriceHistory> {
                priceHistory
            };
            source.DataLockStatus = new List <DataLockStatus> {
                dataLockStatus
            };
            source.ApprenticeshipUpdate = new List <ApprenticeshipUpdate>();

            //Act
            var result = await mapper.Map(source);

            //Assert
            result.Alerts.Should().BeNullOrEmpty();
        }
Beispiel #8
0
        public async Task And_Employer_Has_Unresolved_Errors_That_Have_Known_Triage_Status_And_Has_Course_DataLock_Changes_Requested_Only_One_Changes_Requested_Added(
            Apprenticeship source,
            DataLockStatus dataLockStatus,
            DataLockStatus dataLockStatus2,
            PriceHistory priceHistory,
            ApprenticeshipToApprenticeshipDetailsMapper mapper)
        {
            //Arrange
            dataLockStatus.Status        = Status.Fail;
            dataLockStatus.TriageStatus  = TriageStatus.Restart;
            dataLockStatus.IsResolved    = false;
            dataLockStatus2.ErrorCode    = DataLockErrorCode.Dlock03;
            dataLockStatus2.TriageStatus = TriageStatus.Restart;
            dataLockStatus2.IsResolved   = false;
            source.IsProviderSearch      = false;
            source.DataLockStatus        = new List <DataLockStatus> {
                dataLockStatus, dataLockStatus2
            };
            source.PriceHistory = new List <PriceHistory> {
                priceHistory
            };
            source.ApprenticeshipUpdate = new List <ApprenticeshipUpdate>();

            //Act
            var result = await mapper.Map(source);

            //Assert
            result.Alerts.Should().NotBeNullOrEmpty();
            result.Alerts.Should().BeEquivalentTo(new List <Alerts> {
                Alerts.ChangesRequested
            });
        }
 public static bool WithCourseError(this DataLockStatus dataLockStatus)
 {
     return(dataLockStatus.ErrorCode.HasFlag(DataLockErrorCode.Dlock03) ||
            dataLockStatus.ErrorCode.HasFlag(DataLockErrorCode.Dlock04) ||
            dataLockStatus.ErrorCode.HasFlag(DataLockErrorCode.Dlock05) ||
            dataLockStatus.ErrorCode.HasFlag(DataLockErrorCode.Dlock06));
 }
        public void ThenTheDateIsParsedCorrectly(string priceEpisodeIdentifer, DateTime expectedDate)
        {
            var datalock = new DataLockStatus
            {
                PriceEpisodeIdentifier = priceEpisodeIdentifer
            };

            Assert.AreEqual(expectedDate, datalock.GetDateFromPriceEpisodeIdentifier());
        }
        private async Task AssertNoPendingApprenticeshipUpdate(DataLockStatus dataLockStatus, long apprenticeshipId)
        {
            var pending = await _apprenticeshipUpdateRepository.GetPendingApprenticeshipUpdate(apprenticeshipId);

            if (pending != null)
            {
                throw new ValidationException($"Data lock {dataLockStatus.DataLockEventId} with error code {dataLockStatus.ErrorCode} cannot be triaged due to apprenticeship {apprenticeshipId} having pending update");
            }
        }
        public static bool WithCourseAndPriceError(this DataLockStatus dataLockStatus)
        {
            var hasCourse = dataLockStatus.ErrorCode.HasFlag(DataLockErrorCode.Dlock03) ||
                            dataLockStatus.ErrorCode.HasFlag(DataLockErrorCode.Dlock04) ||
                            dataLockStatus.ErrorCode.HasFlag(DataLockErrorCode.Dlock05) ||
                            dataLockStatus.ErrorCode.HasFlag(DataLockErrorCode.Dlock06);

            return(hasCourse && dataLockStatus.ErrorCode.HasFlag(DataLockErrorCode.Dlock07));
        }
        /// <summary>
        /// Generates a set of datalocks for the input apprenticeships
        /// </summary>
        /// <param name="rows"></param>
        private static DataLockCollection CreateDataLockCollection(List <DataRow> rows)
        {
            var result = new DataLockCollection
            {
                PageNumber         = 1,
                TotalNumberOfPages = 1
            };

            foreach (var row in rows)
            {
                var datalock = new DataLockStatus();

                var course = row.ProgType == "25" ?
                             row.StdCode :
                             $"{row.FworkCode}-{row.ProgType}-{row.PwayCode}";

                var pei = $"{course}-{row.StartDate.ToString("d")}"; //todo: also simulate 01/08/2018

                datalock.Id = DataHelper.GetNextDataLockEventId();
                datalock.ProcessDateTime           = DateTime.UtcNow;
                datalock.IlrFileName               = "ilr-submission.xml";
                datalock.Ukprn                     = 10000534;
                datalock.Uln                       = Int64.Parse(row.ULN);
                datalock.Status                    = "New"; //todo: simulate multiple events of diff. statuses
                datalock.LearnRefNumber            = "1";
                datalock.AimSeqNumber              = 1;
                datalock.PriceEpisodeIdentifier    = pei;
                datalock.ApprenticeshipId          = row.Id;
                datalock.EventSource               = "Submission";
                datalock.IlrStartDate              = row.StartDate; //todo: provide variance with below
                datalock.IlrProgrammeType          = Int32.Parse(row.ProgType);
                datalock.IlrStandardCode           = row.StdCode == null ? default(int?) : Int32.Parse(row.StdCode);
                datalock.IlrFrameworkCode          = row.FworkCode == null ? default(int?) : Int32.Parse(row.FworkCode);
                datalock.IlrPathwayCode            = row.PwayCode == null ? default(int?) : Int32.Parse(row.PwayCode);
                datalock.IlrTrainingPrice          = row.TotalPrice * 2;
                datalock.IlrEndpointAssessorPrice  = 0;
                datalock.IlrPriceEffectiveDate     = row.StartDate;
                datalock.IlrPriceEffectiveFromDate = row.StartDate;
                datalock.Errors.Add(new DataLockError
                {
                    ErrorCode         = "DLOCK_07",
                    SystemDescription = "Price datalock"
                });
                result.Items.Add(datalock);
            }

            //if programme type == 25, then include a std code, otherwise framework + prog type + pathway

            //                new TrainingCourse { FworkCode = "583", ProgType = "3", PwayCode = "4"},

            return(result);
        }
        public async Task ShouldUpdateApprenticeshipIfCourseHasChanged()
        {
            var trainingCode = 10123;
            var standard     = new Standard {
                Title = "Standard 1", Code = trainingCode, CourseName = "Standard 1 Course Name", Level = 1
            };

            var isDataLockWithCourse = new DataLockStatus {
                DataLockEventId = 1, ApprenticeshipId = _command.ApprenticeshipId, IsResolved = false, Status = Status.Fail, IlrTotalCost = 505,
                ErrorCode       = DataLockErrorCode.Dlock07 | DataLockErrorCode.Dlock03, IlrEffectiveFromDate = DateTime.Now, TriageStatus = TriageStatus.Change, IlrTrainingCourseCode = $"{trainingCode}"
            };

            var toBeUpdateDataLock = new DataLockStatus {
                DataLockEventId = 3, ApprenticeshipId = _command.ApprenticeshipId, IsResolved = false, Status = Status.Fail, IlrTotalCost = 400,
                ErrorCode       = DataLockErrorCode.Dlock07, IlrEffectiveFromDate = DateTime.Now.AddMonths(1), TriageStatus = TriageStatus.Change
            };

            _dataLockRepository.Setup(m => m.GetDataLocks(_command.ApprenticeshipId, false))
            .ReturnsAsync(new List <DataLockStatus> {
                isDataLockWithCourse, toBeUpdateDataLock
            });

            _apprenticeshipRepository.Setup(m => m.GetApprenticeship(_command.ApprenticeshipId))
            .ReturnsAsync(new Apprenticeship {
                CommitmentId = 123456L, HasHadDataLockSuccess = false, EmployerAccountId = 12345
            });

            _apprenticeshipTrainingService.Setup(m => m.GetTrainingProgramAsync($"{trainingCode}", false))
            .ReturnsAsync(standard);

            Apprenticeship updatedApprenticeship = null;

            _apprenticeshipRepository.Setup(
                m => m.UpdateApprenticeship(It.IsAny <Apprenticeship>(), It.IsAny <Caller>()))
            .Callback <Apprenticeship, Caller>((a, c) => updatedApprenticeship = a)
            .Returns(Task.FromResult(0));

            await _sut.Handle(_command);

            _dataLockRepository.Verify(m => m.ResolveDataLock(It.IsAny <IEnumerable <long> >()), Times.Once);

            _apprenticeshipTrainingService.Verify(m => m.GetTrainingProgramAsync(standard.Code.ToString(), false), Times.Once);
            _apprenticeshipRepository.Verify(m => m.UpdateApprenticeship(It.IsAny <Apprenticeship>(), It.IsAny <Caller>()), Times.Once);

            updatedApprenticeship.TrainingCode.Should().Be(standard.Code.ToString());
            updatedApprenticeship.TrainingName.Should().Be(standard.Title);
            updatedApprenticeship.TrainingType.Should().Be(TrainingType.Standard);
        }
Beispiel #15
0
        public async Task ThenTheResultShouldBeMapped()
        {
            //Arrange
            var dataLockStatus = new DataLockStatus
            {
                DataLockEventId        = 1L,
                DataLockEventDatetime  = new DateTime(2018, 3, 1),
                PriceEpisodeIdentifier = "PRICE_EPISODE_ID",
                ApprenticeshipId       = 999L,
                IlrTrainingCourseCode  = "TRAINING_COURSE_CODE",
                IlrTrainingType        = TrainingType.Framework,
                IlrActualStartDate     = new DateTime(2018, 1, 1),
                IlrEffectiveFromDate   = new DateTime(2018, 12, 31),
                IlrTotalCost           = decimal.One,
                Status       = Status.Fail,
                TriageStatus = TriageStatus.Change,
                ErrorCode    = DataLockErrorCode.Dlock01
            };

            _dataLockRepository.Setup(x => x.GetDataLocks(It.IsAny <long>(), It.IsAny <bool>()))
            .ReturnsAsync(new List <DataLockStatus>
            {
                dataLockStatus
            });

            var request = new GetDataLocksRequest();

            //Act
            var result = await _handler.Handle(request);

            //Assert
            Assert.AreEqual(1, result.Data.Count);

            var dataLockResult = result.Data[0];

            Assert.AreEqual(dataLockStatus.DataLockEventId, dataLockResult.DataLockEventId);
            Assert.AreEqual(dataLockStatus.DataLockEventDatetime, dataLockResult.DataLockEventDatetime);
            Assert.AreEqual(dataLockStatus.PriceEpisodeIdentifier, dataLockResult.PriceEpisodeIdentifier);
            Assert.AreEqual(dataLockStatus.ApprenticeshipId, dataLockResult.ApprenticeshipId);
            Assert.AreEqual(dataLockStatus.IlrTrainingCourseCode, dataLockResult.IlrTrainingCourseCode);
            Assert.AreEqual(dataLockStatus.IlrTrainingType, (TrainingType)dataLockResult.IlrTrainingType);
            Assert.AreEqual(dataLockStatus.IlrActualStartDate, dataLockResult.IlrActualStartDate);
            Assert.AreEqual(dataLockStatus.IlrEffectiveFromDate, dataLockResult.IlrEffectiveFromDate);
            Assert.AreEqual(dataLockStatus.IlrTotalCost, dataLockResult.IlrTotalCost);
            Assert.AreEqual(dataLockStatus.Status, (Status)dataLockResult.Status);
            Assert.AreEqual(dataLockStatus.TriageStatus, (TriageStatus)dataLockResult.TriageStatus);
            Assert.AreEqual(dataLockStatus.ErrorCode, (DataLockErrorCode)dataLockResult.ErrorCode);
        }
 private static void AssertEquality(DataLockStatus source, GetDataLocksQueryResult.DataLock result)
 {
     Assert.AreEqual(source.Id, result.Id);
     Assert.AreEqual(source.DataLockEventDatetime, result.DataLockEventDatetime);
     Assert.AreEqual(source.PriceEpisodeIdentifier, result.PriceEpisodeIdentifier);
     Assert.AreEqual(source.ApprenticeshipId, result.ApprenticeshipId);
     Assert.AreEqual(source.IlrTrainingCourseCode, result.IlrTrainingCourseCode);
     Assert.AreEqual(source.IlrActualStartDate, result.IlrActualStartDate);
     Assert.AreEqual(source.IlrEffectiveFromDate, result.IlrEffectiveFromDate);
     Assert.AreEqual(source.IlrPriceEffectiveToDate, result.IlrPriceEffectiveToDate);
     Assert.AreEqual(source.IlrTotalCost, result.IlrTotalCost);
     Assert.AreEqual(source.ErrorCode, result.ErrorCode);
     Assert.AreEqual(source.Status, result.DataLockStatus);
     Assert.AreEqual(source.TriageStatus, result.TriageStatus);
     Assert.AreEqual(source.IsResolved, result.IsResolved);
 }
 private DataLockViewModel MapDataLockStatus(DataLockStatus dataLock, TrainingProgramme training)
 {
     return(new DataLockViewModel
     {
         DataLockEventId = dataLock.DataLockEventId,
         DataLockEventDatetime = dataLock.DataLockEventDatetime,
         PriceEpisodeIdentifier = dataLock.PriceEpisodeIdentifier,
         ApprenticeshipId = dataLock.ApprenticeshipId,
         IlrTrainingCourseCode = dataLock.IlrTrainingCourseCode,
         IlrTrainingType = (TrainingType)dataLock.IlrTrainingType,
         IlrTrainingCourseName = training.Name,
         IlrActualStartDate = dataLock.IlrActualStartDate,
         IlrEffectiveFromDate = dataLock.IlrEffectiveFromDate,
         IlrEffectiveToDate = dataLock.IlrEffectiveToDate,
         IlrTotalCost = dataLock.IlrTotalCost,
         TriageStatusViewModel = (TriageStatusViewModel)dataLock.TriageStatus,
         DataLockErrorCode = dataLock.ErrorCode
     });
 }
Beispiel #18
0
        public async Task And_Has_PendingUpdateOriginator_Null_Then_No_Alert(
            Apprenticeship source,
            DataLockStatus dataLockStatus,
            PriceHistory priceHistory,
            ApprenticeshipToApprenticeshipDetailsMapper mapper)
        {
            source.ApprenticeshipUpdate = new List <ApprenticeshipUpdate>();
            source.ApprenticeshipUpdate = null;
            source.DataLockStatus       = new List <DataLockStatus> {
                dataLockStatus
            };
            source.PriceHistory = new List <PriceHistory> {
                priceHistory
            };

            var result = await mapper.Map(source);

            result.Alerts.Should().BeEmpty();
        }
        public async Task ShouldExcludeSomeDataLocksWhenUpdatingPriceHistory()
        {
            var isResolvedDataLock = new DataLockStatus {
                DataLockEventId = 1, ApprenticeshipId = _command.ApprenticeshipId, IsResolved = true, Status = Status.Fail, IlrTotalCost = 505,
                ErrorCode       = DataLockErrorCode.Dlock07, IlrEffectiveFromDate = DateTime.Now, TriageStatus = TriageStatus.Change
            };
            var isPassedDataLock = new DataLockStatus {
                DataLockEventId = 2, ApprenticeshipId = _command.ApprenticeshipId, IsResolved = false, Status = Status.Pass, IlrTotalCost = 499,
                ErrorCode       = DataLockErrorCode.Dlock07, IlrEffectiveFromDate = DateTime.Now
            };
            var toBeUpdateDataLock = new DataLockStatus {
                DataLockEventId = 3, ApprenticeshipId = _command.ApprenticeshipId, IsResolved = false, Status = Status.Fail, IlrTotalCost = 400,
                ErrorCode       = DataLockErrorCode.Dlock07, IlrEffectiveFromDate = DateTime.Now.AddMonths(1), TriageStatus = TriageStatus.Change
            };

            _dataLockRepository.Setup(m => m.GetDataLocks(_command.ApprenticeshipId, false))
            .ReturnsAsync(new List <DataLockStatus> {
                isResolvedDataLock, isPassedDataLock, toBeUpdateDataLock
            });

            long[] idsToBeUpdated = null;
            _dataLockRepository.Setup(m => m.ResolveDataLock(It.IsAny <IEnumerable <long> >())).Callback <IEnumerable <long> >((ids) => { idsToBeUpdated = ids.ToArray(); })
            .ReturnsAsync(0);

            IEnumerable <PriceHistory> prices = null;

            _apprenticeshipRepository.Setup(
                m => m.InsertPriceHistory(_command.ApprenticeshipId, It.IsAny <IEnumerable <PriceHistory> >()))
            .Callback <long, IEnumerable <PriceHistory> >((i, l) => prices = l)
            .Returns(Task.FromResult(1L));

            await _sut.Handle(_command);

            _apprenticeshipRepository.Verify(m => m.InsertPriceHistory(_command.ApprenticeshipId, It.IsAny <IEnumerable <PriceHistory> >()), Times.Once);

            prices.Count().ShouldBeEquivalentTo(3);
            _dataLockRepository.Verify(m => m.ResolveDataLock(
                                           It.Is <IEnumerable <long> >(d => d.Contains(toBeUpdateDataLock.DataLockEventId) && d.Count() == 1)), Times.Once);

            idsToBeUpdated.Should().NotContain(isResolvedDataLock.DataLockEventId, because: "Should not update already resolved datalocks");
            idsToBeUpdated.Should().NotContain(isPassedDataLock.DataLockEventId, because: "Should not update passed datalocks");
            idsToBeUpdated.Should().Contain(toBeUpdateDataLock.DataLockEventId, because: "Should update datalocks with triage status 'change' that is not passed or resolved");
        }
Beispiel #20
0
        private ICollection <DataLockStatus> SetupDataLocks(long apprenticeshipId)
        {
            var activeDataLock4 = new DataLockStatus
            {
                ApprenticeshipId = apprenticeshipId,
                EventStatus      = EventStatus.New,
                IsExpired        = false,
                TriageStatus     = TriageStatus.Restart,
                ErrorCode        = DataLockErrorCode.Dlock04
            };

            var activeDataLock5 = new DataLockStatus
            {
                ApprenticeshipId = apprenticeshipId,
                EventStatus      = EventStatus.New,
                IsExpired        = false,
                TriageStatus     = TriageStatus.Restart,
                ErrorCode        = DataLockErrorCode.Dlock05
            };

            var inactiveDataLock6 = new DataLockStatus
            {
                ApprenticeshipId = apprenticeshipId,
                EventStatus      = EventStatus.Removed,
                IsExpired        = false,
                TriageStatus     = TriageStatus.Restart,
                ErrorCode        = DataLockErrorCode.Dlock04
            };

            var dataLockForApprenticeshipBeforeStart = new DataLockStatus
            {
                ApprenticeshipId = apprenticeshipId,
                EventStatus      = EventStatus.New,
                IsExpired        = false,
                TriageStatus     = TriageStatus.Change,
                ErrorCode        = DataLockErrorCode.Dlock04
            };

            return(new List <DataLockStatus> {
                activeDataLock4, activeDataLock5, inactiveDataLock6, dataLockForApprenticeshipBeforeStart
            });
        }
Beispiel #21
0
        public async Task And_Has_ErrorCode_None_And_TriageStatus_Unknown_Then_No_Alerts(
            Apprenticeship source,
            DataLockStatus dataLockStatus,
            PriceHistory priceHistory,
            ApprenticeshipToApprenticeshipDetailsMapper mapper)
        {
            dataLockStatus.ErrorCode    = DataLockErrorCode.None;
            dataLockStatus.TriageStatus = TriageStatus.Unknown;
            source.PriceHistory         = new List <PriceHistory> {
                priceHistory
            };
            source.DataLockStatus = new List <DataLockStatus> {
                dataLockStatus
            };
            source.ApprenticeshipUpdate = new List <ApprenticeshipUpdate>();

            var result = await mapper.Map(source);

            result.Alerts.Should().BeEmpty();
        }
        public async Task ShouldResolveDataLockWithCourse(bool hasHadDatalockSuccess)
        {
            var isDataLockWithCourse = new DataLockStatus {
                DataLockEventId = 1, ApprenticeshipId = _command.ApprenticeshipId, IsResolved = false, Status = Status.Fail, IlrTotalCost = 505,
                ErrorCode       = DataLockErrorCode.Dlock07 | DataLockErrorCode.Dlock03, IlrEffectiveFromDate = DateTime.Now, TriageStatus = TriageStatus.Change
            };

            var toBeUpdateDataLock = new DataLockStatus {
                DataLockEventId = 3, ApprenticeshipId = _command.ApprenticeshipId, IsResolved = false, Status = Status.Fail, IlrTotalCost = 400,
                ErrorCode       = DataLockErrorCode.Dlock07, IlrEffectiveFromDate = DateTime.Now.AddMonths(1), TriageStatus = TriageStatus.Change
            };


            _dataLockRepository.Setup(m => m.GetDataLocks(_command.ApprenticeshipId, false))
            .ReturnsAsync(new List <DataLockStatus> {
                isDataLockWithCourse, toBeUpdateDataLock
            });

            _apprenticeshipRepository.Setup(m => m.GetApprenticeship(_command.ApprenticeshipId))
            .ReturnsAsync(new Apprenticeship {
                CommitmentId = 123456L, HasHadDataLockSuccess = hasHadDatalockSuccess
            });

            long[] idsToBeUpdated = null;
            _dataLockRepository.Setup(m => m.ResolveDataLock(It.IsAny <IEnumerable <long> >())).Callback <IEnumerable <long> >((ids) => { idsToBeUpdated = ids.ToArray(); })
            .ReturnsAsync(0);

            await _sut.Handle(_command);

            _dataLockRepository.Verify(m => m.ResolveDataLock(It.IsAny <IEnumerable <long> >()), Times.Once);
            if (hasHadDatalockSuccess)
            {
                idsToBeUpdated.Should().NotContain(isDataLockWithCourse.DataLockEventId, because: "Should not update when apprenticeship has had a datalock success");
            }
            else
            {
                idsToBeUpdated.Should().Contain(isDataLockWithCourse.DataLockEventId, because: "Should not update when apprenticeship has NOT had a datalock success");
            }

            idsToBeUpdated.Should().Contain(toBeUpdateDataLock.DataLockEventId, because: "Should update datalocks with triage status 'change' that is not passed or resolved");
        }
Beispiel #23
0
        public async Task And_Has_Resolved_Alert_Then_Nothing_Is_Mapped(
            Apprenticeship source,
            DataLockStatus dataLockStatus,
            PriceHistory priceHistory,
            ApprenticeshipToApprenticeshipDetailsMapper mapper)
        {
            dataLockStatus.ErrorCode    = DataLockErrorCode.Dlock07;
            dataLockStatus.TriageStatus = TriageStatus.Change;
            dataLockStatus.IsResolved   = true;
            source.DataLockStatus       = new List <DataLockStatus> {
                dataLockStatus
            };
            source.PriceHistory = new List <PriceHistory> {
                priceHistory
            };
            source.ApprenticeshipUpdate = new List <ApprenticeshipUpdate>();

            var result = await mapper.Map(source);

            result.Alerts.Should().BeEmpty();
        }
Beispiel #24
0
        public async Task <long> UpdateDataLockStatus(DataLockStatus dataLockStatus)
        {
            _logger.Info($"Updating or inserting data lock status {dataLockStatus.DataLockEventId}, EventsStatus: {dataLockStatus.EventStatus}");
            try
            {
                var result = await WithConnection(async connection =>
                {
                    var parameters = new DynamicParameters();

                    parameters.Add("@DataLockEventId", dataLockStatus.DataLockEventId);
                    parameters.Add("@DataLockEventDatetime", dataLockStatus.DataLockEventDatetime);
                    parameters.Add("@PriceEpisodeIdentifier", dataLockStatus.PriceEpisodeIdentifier);
                    parameters.Add("@ApprenticeshipId", dataLockStatus.ApprenticeshipId);
                    parameters.Add("@IlrTrainingCourseCode", dataLockStatus.IlrTrainingCourseCode);
                    parameters.Add("@IlrTrainingType", dataLockStatus.IlrTrainingType);
                    parameters.Add("@IlrActualStartDate", dataLockStatus.IlrActualStartDate);
                    parameters.Add("@IlrEffectiveFromDate", dataLockStatus.IlrEffectiveFromDate);
                    parameters.Add("@IlrPriceEffectiveToDate", dataLockStatus.IlrPriceEffectiveToDate);
                    parameters.Add("@IlrTotalCost", dataLockStatus.IlrTotalCost);
                    parameters.Add("@ErrorCode", dataLockStatus.ErrorCode);
                    parameters.Add("@Status", dataLockStatus.Status);
                    parameters.Add("@TriageStatus", dataLockStatus.TriageStatus);
                    parameters.Add("@ApprenticeshipUpdateId", dataLockStatus.ApprenticeshipUpdateId);
                    parameters.Add("@IsResolved", dataLockStatus.IsResolved);
                    parameters.Add("@EventStatus", dataLockStatus.EventStatus);

                    return(await connection.ExecuteAsync(
                               sql: $"[dbo].[UpdateDataLockStatus]",
                               param: parameters,
                               commandType: CommandType.StoredProcedure));
                });

                return(result);
            }
            catch (Exception ex) when(ex.InnerException is SqlException && IsConstraintError(ex.InnerException as SqlException))
            {
                throw new RepositoryConstraintException("Unable to insert datalockstatus record", ex);
            }
        }
Beispiel #25
0
        public async Task And_Has_ErrorCode_DLock03_And_TriageStatus_Restart_Then_Changes_Requested_Alert(
            Apprenticeship source,
            DataLockStatus dataLockStatus,
            PriceHistory priceHistory,
            ApprenticeshipToApprenticeshipDetailsMapper mapper)
        {
            dataLockStatus.ErrorCode    = DataLockErrorCode.Dlock03;
            dataLockStatus.TriageStatus = TriageStatus.Restart;
            dataLockStatus.IsResolved   = false;
            source.PriceHistory         = new List <PriceHistory> {
                priceHistory
            };
            source.DataLockStatus = new List <DataLockStatus> {
                dataLockStatus
            };
            source.ApprenticeshipUpdate = new List <ApprenticeshipUpdate>();

            var result = await mapper.Map(source);

            result.Alerts.Should().BeEquivalentTo(new List <Alerts> {
                Alerts.ChangesRequested
            });
        }
        private void AssertValidTriageStatus(TriageStatus triageStatus, DataLockStatus dataLockStatus)
        {
            if (triageStatus == TriageStatus.Change)
            {
                if (!(dataLockStatus.ErrorCode.HasFlag(DataLockErrorCode.Dlock07) ||
                      dataLockStatus.ErrorCode.HasFlag(DataLockErrorCode.Dlock09)))
                {
                    throw new ValidationException($"Data lock {dataLockStatus.DataLockEventId} with error code {dataLockStatus.ErrorCode} cannot be triaged as {triageStatus}");
                }
            }

            if (triageStatus == TriageStatus.Restart)
            {
                if (!(dataLockStatus.ErrorCode.HasFlag(DataLockErrorCode.Dlock03) ||
                      dataLockStatus.ErrorCode.HasFlag(DataLockErrorCode.Dlock04) ||
                      dataLockStatus.ErrorCode.HasFlag(DataLockErrorCode.Dlock05) ||
                      dataLockStatus.ErrorCode.HasFlag(DataLockErrorCode.Dlock06)
                      ))
                {
                    throw new ValidationException($"Data lock {dataLockStatus.DataLockEventId} with error code {dataLockStatus.ErrorCode} cannot be triaged as {triageStatus}");
                }
            }
        }
 public static bool UnHandled(this DataLockStatus dl)
 {
     return(!dl.IsResolved && dl.Status != Status.Pass);
 }
 public static bool IsPriceOnly(this DataLockStatus dataLockStatus)
 {
     return((int)dataLockStatus.ErrorCode == (int)DataLockErrorCode.Dlock07);
 }
        public async Task <DataLockViewModel> MapDataLockStatus(DataLockStatus dataLock)
        {
            var training = await GetTrainingProgramme(dataLock.IlrTrainingCourseCode);

            return(MapDataLockStatus(dataLock, training));
        }
        private void AutoResolveDataLockIfApprenticeshipStoppedAndBackdated(Apprenticeship apprenticeship, DataLockStatus datalock)
        {
            if (apprenticeship.PaymentStatus == PaymentStatus.Withdrawn &&
                apprenticeship.StopDate == apprenticeship.StartDate)
            {
                _logger.Info($"Auto-resolving datalock for Apprenticeship #{datalock.ApprenticeshipId} withdrawn effective at start date. Event Id {datalock.DataLockEventId}");

                datalock.IsResolved = true;
            }
        }