// 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); } } }
public void CreatesVaccinationStateStringCorrectly() { // Arrange var clinicalDetails = new ClinicalDetails { BCGVaccinationState = Status.Yes, BCGVaccinationYear = 2000, }; // Act var stateAndYear = clinicalDetails.BCGVaccinationStateAndYear; // Assert Assert.Equal("Yes - 2000", stateAndYear); }
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); }
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); }
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); }
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); }
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); } } }