Ejemplo n.º 1
0
 // The two events of TreatmentStart and Diagnosis are somewhat interchangeable, as Diagnosis is the fallback
 // "starting event" when no treatment start is recorded.
 // We need two distinct types so the labels are correct though!
 // We don't want both events in, since we want the outcome dates to be based off of treatment start
 public static void SetStartingEventDate(TreatmentEvent treatmentStartEvent, ClinicalDetails clinicalDetails)
 {
     treatmentStartEvent.EventDate          = clinicalDetails.StartingDate;
     treatmentStartEvent.TreatmentEventType = clinicalDetails.TreatmentStartDate != null
         ? TreatmentEventType.TreatmentStart
         : TreatmentEventType.DiagnosisMade;
 }
        public async Task UpdateStartingEvent(Notification notification, ClinicalDetails clinicalDetails)
        {
            var startingEvent = notification.TreatmentEvents.SingleOrDefault(t => t.IsStartingEvent);

            if (startingEvent != null)
            {
                NotificationHelper.SetStartingEventDateAndType(startingEvent, clinicalDetails);
                await UpdateAsync(notification, startingEvent);
            }
        }
        protected override async Task ValidateAndSave()
        {
            UpdateFlags();
            SetDatesOnClinicalDetails();

            if (ClinicalDetails.BCGVaccinationYear != null)
            {
                ValidationService.ValidateYearComparison(ClinicalDetails, nameof(ClinicalDetails.BCGVaccinationYear),
                                                         (int)ClinicalDetails.BCGVaccinationYear, PatientBirthYear);
            }

            var notificationSites = CreateNotificationSitesFromModel(Notification).ToList();

            // Add additional field required for date validation
            ClinicalDetails.Dob = Notification.PatientDetails.Dob;

            ClinicalDetails.SetValidationContext(Notification);
            OtherSite?.SetValidationContext(Notification);

            // Since notification has other properties which are not populated by this page but have validation rules,
            // validation of a whole Notification model will result in validation errors.
            // Therefore we need to manually validate NotificationSites and TryValidate other models
            if (Notification.ShouldValidateFull && !notificationSites.Any())
            {
                ModelState.AddModelError("Notification.NotificationSites", ValidationMessages.DiseaseSiteIsRequired);
            }

            TryValidateModel(ClinicalDetails, nameof(ClinicalDetails));
            if (OtherSite != null)
            {
                TryValidateModel(OtherSite, nameof(OtherSite));
            }

            var mdrChanged       = Notification.ClinicalDetails.TreatmentRegimen != ClinicalDetails.TreatmentRegimen;
            var nonMdrNotAllowed = !ClinicalDetails.IsMDRTreatment && Notification.MdrDetailsEntered;

            if (mdrChanged && nonMdrNotAllowed)
            {
                ModelState.AddModelError("ClinicalDetails.IsMDRTreatment", ValidationMessages.MDRCantChange);
            }

            AddPostMortemErrorsIfApplicable();

            if (ModelState.IsValid)
            {
                await Service.UpdateClinicalDetailsAsync(Notification, ClinicalDetails);

                await Service.UpdateSitesAsync(Notification.NotificationId, notificationSites);

                if (mdrChanged)
                {
                    await _enhancedSurveillanceAlertsService.CreateOrDismissMdrAlert(Notification);
                }
            }
        }
Ejemplo n.º 4
0
        public void CreatesVaccinationStateStringCorrectly()
        {
            // Arrange
            var clinicalDetails = new ClinicalDetails {
                BCGVaccinationState = Status.Yes, BCGVaccinationYear = 2000,
            };

            // Act
            var stateAndYear = clinicalDetails.BCGVaccinationStateAndYear;

            // Assert
            Assert.Equal("Yes - 2000", stateAndYear);
        }
Ejemplo n.º 5
0
        public void FormatsDateCorrectly()
        {
            // Arrange
            var clinicalDetails = new ClinicalDetails {
                SymptomStartDate = new DateTime(2000, 1, 1)
            };

            // Act
            var formattedDate = clinicalDetails.FormattedSymptomStartDate;

            // Assert
            Assert.Equal("01 Jan 2000", formattedDate);
        }
Ejemplo n.º 6
0
        public void CalculatesDaysBetweenDates()
        {
            // Arrange
            var clinicalDetails = new ClinicalDetails
            {
                SymptomStartDate      = new DateTime(2000, 1, 1),
                FirstPresentationDate = new DateTime(2000, 1, 4)
            };

            // Act
            var days = clinicalDetails.DaysFromOnsetToFirstPresentation;

            // Assert
            Assert.Equal("3 days", days);
        }
Ejemplo n.º 7
0
        public void CreatesMdrTreatmentStringCorrectly(int?year, int?month, int?day, string expectedResult)
        {
            // Arrange
            var clinicalDetails = new ClinicalDetails();

            if (year != null && month != null && day != null)
            {
                var dateTime = new DateTime((int)year, (int)month, (int)day);
                clinicalDetails.MDRTreatmentStartDate = dateTime;
            }

            clinicalDetails.TreatmentRegimen = TreatmentRegimen.MdrTreatment;

            // Act
            var stateAndDate = clinicalDetails.FormattedTreatmentRegimen;

            // Assert
            Assert.Equal(expectedResult, stateAndDate);
        }
Ejemplo n.º 8
0
        public async Task UpdateClinicalDetailsAsync(Notification notification, ClinicalDetails clinicalDetails)
        {
            // This check needs to happen BEFORE we change these values below
            var startingEventAffected =
                clinicalDetails.TreatmentStartDate != notification.ClinicalDetails.TreatmentStartDate ||
                clinicalDetails.DiagnosisDate != notification.ClinicalDetails.DiagnosisDate;

            _context.SetValues(notification.ClinicalDetails, clinicalDetails);

            await _notificationRepository.SaveChangesAsync();

            if (startingEventAffected)
            {
                await _treatmentEventRepository.UpdateStartingEvent(notification, clinicalDetails);
            }
            await _alertService.AutoDismissAlertAsync <DataQualityClinicalDatesAlert>(notification);

            await _alertService.AutoDismissAlertAsync <DataQualityDotVotAlert>(notification);
        }
Ejemplo n.º 9
0
        private static ClinicalDetails ExtractClinicalDetails(MigrationDbNotification notification)
        {
            var details = new ClinicalDetails();

            details.SymptomStartDate          = notification.SymptomOnsetDate;
            details.FirstPresentationDate     = notification.FirstPresentationDate;
            details.TBServicePresentationDate = notification.TbServicePresentationDate;
            details.DiagnosisDate             = notification.DiagnosisDate ?? notification.StartOfTreatmentDate ?? notification.NotificationDate;
            details.DidNotStartTreatment      = Converter.GetNullableBoolValue(notification.DidNotStartTreatment);
            details.TreatmentStartDate        = notification.StartOfTreatmentDate;
            details.MDRTreatmentStartDate     = notification.MDRTreatmentStartDate;
            details.IsSymptomatic             = Converter.GetNullableBoolValue(notification.IsSymptomatic);
            details.IsPostMortem = Converter.GetNullableBoolValue(notification.IsPostMortem);
            details.HIVTestState = Converter.GetEnumValue <HIVTestStatus>(notification.HivTestStatus);
            details.IsDotOffered = Converter.GetStatusFromString(notification.IsDotOffered);
            details.DotStatus    = Converter.GetEnumValue <DotStatus>(notification.DotStatus);
            details.EnhancedCaseManagementStatus = Converter.GetStatusFromString(notification.EnhancedCaseManagementStatus);
            details.BCGVaccinationState          = Converter.GetStatusFromString(notification.BCGVaccinationState);
            details.BCGVaccinationYear           = notification.BCGVaccinationYear;
            details.TreatmentRegimen             = Converter.GetEnumValue <TreatmentRegimen>(notification.TreatmentRegimen);
            details.Notes = notification.Notes;
            return(details);
        }
        protected override async Task ValidateAndSave()
        {
            UpdateFlags();
            new List <(string key, FormattedDate date)> {
                (nameof(ClinicalDetails.SymptomStartDate), FormattedSymptomDate),
                (nameof(ClinicalDetails.FirstPresentationDate), FormattedFirstPresentationDate),
                (nameof(ClinicalDetails.TBServicePresentationDate), FormattedTbServicePresentationDate),
                (nameof(ClinicalDetails.DiagnosisDate), FormattedDiagnosisDate),
                (nameof(ClinicalDetails.TreatmentStartDate), FormattedTreatmentDate),
                (nameof(ClinicalDetails.FirstHomeVisitDate), FormattedHomeVisitDate),
                (nameof(ClinicalDetails.MDRTreatmentStartDate), FormattedMdrTreatmentDate)
            }.ForEach(item =>
                      ValidationService.TrySetFormattedDate(ClinicalDetails, "ClinicalDetails", item.key, item.date)
                      );

            if (ClinicalDetails.BCGVaccinationYear != null)
            {
                ValidationService.ValidateYearComparison(ClinicalDetails, nameof(ClinicalDetails.BCGVaccinationYear),
                                                         (int)ClinicalDetails.BCGVaccinationYear, PatientBirthYear);
            }

            var notificationSites = CreateNotificationSitesFromModel(Notification).ToList();

            // Add additional field required for date validation
            ClinicalDetails.Dob = Notification.PatientDetails.Dob;

            ClinicalDetails.SetValidationContext(Notification);
            OtherSite?.SetValidationContext(Notification);

            // Since notification has other properties which are not populated by this page but have validation rules,
            // validation of a whole Notification model will result in validation errors.
            // Therefore we need to manually validate NotificationSites and TryValidate other models
            if (Notification.ShouldValidateFull && !notificationSites.Any())
            {
                ModelState.AddModelError("Notification.NotificationSites", ValidationMessages.DiseaseSiteIsRequired);
            }

            TryValidateModel(ClinicalDetails, nameof(ClinicalDetails));
            if (OtherSite != null)
            {
                TryValidateModel(OtherSite, nameof(OtherSite));
            }

            var mdrChanged       = Notification.ClinicalDetails.TreatmentRegimen != ClinicalDetails.TreatmentRegimen;
            var nonMdrNotAllowed = !ClinicalDetails.IsMDRTreatment && Notification.MDRDetails.MDRDetailsEntered;

            if (mdrChanged && nonMdrNotAllowed)
            {
                ModelState.AddModelError("ClinicalDetails.IsMDRTreatment", ValidationMessages.MDRCantChange);
            }
            if (ModelState.IsValid)
            {
                await Service.UpdateClinicalDetailsAsync(Notification, ClinicalDetails);

                await Service.UpdateSitesAsync(Notification.NotificationId, notificationSites);

                if (mdrChanged)
                {
                    await _enhancedSurveillanceAlertsService.CreateOrDismissMdrAlert(Notification);
                }
            }
        }