/// <summary> /// Handles the specified request. /// </summary> /// <param name="request">The request.</param> /// <param name="response">The response.</param> protected override void Handle(GetDtoByKeyRequest <AssessmentSectionSummaryDto> request, DtoResponse <AssessmentSectionSummaryDto> response) { var assessmentInstance = _assessmentInstanceRepository.GetByKey(request.Key); var assessmentDefinition = _assessmentDefinitionRepository.GetByKey(assessmentInstance.AssessmentDefinitionKey); var assessmentSectionSummaryDto = new AssessmentSectionSummaryDto() { Key = assessmentInstance.Key, PatientKey = assessmentInstance.PatientKey, AssessmentDefinitionKey = assessmentDefinition.Key, AssessmentDefinitionCode = assessmentDefinition.CodedConcept.Code, AssessmentName = assessmentDefinition.CodedConcept.Name, IsSubmitted = assessmentInstance.IsSubmitted, IsComplete = Math.Abs(assessmentInstance.CalculateCompleteness().PercentComplete - 1.0d) <= double.Epsilon, Score = assessmentInstance.Score == null ? null : Mapper.Map <Score, ScoreDto> (assessmentInstance.Score), Sections = new List <SectionSummaryDto> (), PercentComplete = assessmentInstance.CalculateCompleteness().PercentComplete * 100, }; MapItems(assessmentSectionSummaryDto, assessmentDefinition, assessmentInstance); response.DataTransferObject = assessmentSectionSummaryDto; var messages = new List <IMessage> (_messageCollector.Messages); if (assessmentInstance.WorkflowKey.HasValue) { var message = _workflowMessageRepository.GetByKey(assessmentInstance.WorkflowKey.Value); if (message.Status == WorkflowMessageStatus.WaitingForResponse) { messages.Add(message); } } response.DataTransferObject.Messages = Mapper.Map <IEnumerable <IMessage>, IEnumerable <IMessageDto> > (messages); }
/// <summary>Generates the specified key.</summary> /// <param name="key">The key.</param> /// <param name="reportName">Name of the report.</param> /// <param name="parameters">The parameters.</param> /// <returns>A <see cref="IReport" />.</returns> /// <exception cref="System.ArgumentException">Invalid parameters.</exception> public IReport Generate(Guid key, string reportName, object parameters = null) { var assessment = _assessmentInstanceRepository.GetByKey(key); var patient = _patientRepository.GetByKey(assessment.PatientKey); var staff = _staffRepository.GetByKey(assessment.CreatedByStaffKey.GetValueOrDefault()); var nihAssessment = new NihHealthBehaviorsAssessment(assessment); var reportDataCollection = new NihHealthBehaviorsAssessmentReportDataCollection { new NihHealthBehaviorsAssessmentReportData(nihAssessment) { SummaryReportInfo = new SummaryReportInfo { PatientId = patient.UniqueIdentifier, PatientName = patient.Name.FullName, StaffName = staff.Name.FullName, ScreeningDate = assessment.CreatedDate.ToShortDateString() } } }; var report = new NihHealthBehaviorsAssessmentPatientSummaryReport { DataSource = reportDataCollection, }; return(report); }
/// <summary>Generates the specified key.</summary> /// <param name="key">The key.</param> /// <param name="reportName">Name of the report.</param> /// <param name="parameters">The parameters.</param> /// <returns>A <see cref="IReport" />.</returns> /// <exception cref="System.ArgumentException">Invalid parameters.</exception> public IReport Generate(Guid key, string reportName, object parameters = null) { var assessment = _assessmentInstanceRepository.GetByKey(key); var patient = _patientRepository.GetByKey(assessment.PatientKey); var staff = _staffRepository.GetByKey(assessment.CreatedByStaffKey.GetValueOrDefault()); var gainShortScreenerScore = assessment.Score.Value as GainShortScreenerScore; var reportDataCollection = new GainShortScreenerReportDataCollection { new GainShortScreenerReportData( gainShortScreenerScore, new SummaryReportInfo { PatientId = patient.UniqueIdentifier, PatientName = patient.Name.FullName, StaffName = staff.Name.FullName, ScreeningDate = assessment.CreatedDate.ToShortDateString(), Summary = GetSummary(gainShortScreenerScore, patient) }) }; var report = new GainShortScreenerSummaryReport { DataSource = reportDataCollection, }; return(report); }
/// <summary> /// Handles the specified request. /// </summary> /// <param name="request">The request.</param> /// <param name="response">The response.</param> protected override void Handle(GetSectionDtoByKeyRequest request, GetSectionDtoByKeyResponse response) { var assessmentInstance = _assessmentInstanceRepository.GetByKey(request.Key); var assessmentDefinition = _assessmentDefinitionRepository.GetByKey(assessmentInstance.AssessmentDefinitionKey); var sectionDto = new SectionDto { Key = assessmentInstance.Key, AssessmentName = assessmentDefinition.CodedConcept.Name, Items = new List <ItemDto> (), }; IContainItemDefinitions itemContainer; if (request.SectionItemDefinitionCode == null) { itemContainer = (IContainItemDefinitions)assessmentDefinition.ItemDefinitions.FirstOrDefault(i => i.ItemType == ItemType.Section) ?? assessmentDefinition; } else { itemContainer = assessmentDefinition.GetItemDefinitionByCode(request.SectionItemDefinitionCode); } if (itemContainer == null) { throw new InvalidOperationException("Section does not exist."); } sectionDto.ItemDefinitionCode = itemContainer.CodedConcept.Code; MapItems(sectionDto, itemContainer, assessmentInstance); response.DataTransferObject = sectionDto; }
public void Handle(AssessmentScoredEvent args) { var assessmentInstance = _assessmentInstanceRepository.GetByKey(args.Key); var workflowEngine = IoC.CurrentContainer.Resolve <IWorkflowEngine>(assessmentInstance.AssessmentName); workflowEngine.Run(assessmentInstance); }
public void Handle(AssessmentSubmittedEvent args) { if (args.Submit) { var assessmentInstance = _assessmentInstanceRepository.GetByKey(args.Key); var scoringEngine = IoC.CurrentContainer.Resolve <IScoringEngine>(assessmentInstance.AssessmentName); scoringEngine.CalculateScore(assessmentInstance); } }
protected override void Handle(SaveAssessmentItemRequest request, SaveAssessmentItemResponse response) { var assessmentInstance = _assessmentInstanceRepository.GetByKey(request.Key); var assessmentDefinition = _assessmentDefinitionRepository.GetByKey(assessmentInstance.AssessmentDefinitionKey); var item = assessmentInstance.ItemInstances.FirstOrDefault(i => i.ItemDefinitionCode == request.Item.ItemDefinitionCode); var itemDefinition = assessmentDefinition.GetItemDefinitionByCode(request.Item.ItemDefinitionCode); var value = request.Item.Value; if (value is LookupDto) { var lookupDto = value as LookupDto; if (string.IsNullOrWhiteSpace(lookupDto.Code)) { value = null; } else { value = itemDefinition.Options.Single(l => l.CodedConcept.Code == lookupDto.Code); } } else if (value is IEnumerable <LookupDto> ) { var lookupType = itemDefinition.Options.ElementAt(0).GetType(); var lookupList = (IList)Activator.CreateInstance(typeof(List <>).MakeGenericType(lookupType)); foreach (var lookupDto in (value as IEnumerable <LookupDto>).Where(l => !string.IsNullOrWhiteSpace(l.Code))) { lookupList.Add(itemDefinition.Options.Single(l => l.CodedConcept.Code == lookupDto.Code)); } value = lookupList.Count == 0 ? null : lookupList; } var hasItemUpdated = HasItemUpdated(item, value); if (hasItemUpdated) { if (value != null) { value = string.IsNullOrEmpty(value.ToString()) ? null : value; } assessmentInstance.UpdateItem(itemDefinition, value); } var assessmentCompleteness = assessmentInstance.CalculateCompleteness(); response.CanSubmit = !assessmentInstance.IsSubmitted && assessmentCompleteness.IsComplete; var containingSection = assessmentDefinition.GetContainingSection(itemDefinition); if (containingSection is AssessmentDefinition) { response.PercentComplete = assessmentCompleteness.PercentComplete; } else if (containingSection is ItemDefinition) { response.PercentComplete = _assessmentCompletenessManager.CalculateCompleteness(assessmentInstance, containingSection as ItemDefinition).PercentComplete; } }
protected override void Handle(SubmitAssessmentRequest request, SubmitAssessmentResponse response) { var assessmentInstance = _assessmentInstanceRepository.GetByKey(request.AssessmentKey); if (request.Submit) { assessmentInstance.Submit(); } else { assessmentInstance.Unsubmit(); } response.ScoreDto = Mapper.Map <Score, ScoreDto> (assessmentInstance.Score); response.Messages = Mapper.Map <IEnumerable <IMessage>, IEnumerable <IMessageDto> >(_messageCollector.Messages); }
/// <summary> /// Handles the specified request. /// </summary> /// <param name="request">The request.</param> /// <param name="response">The response.</param> protected override void Handle(SendEmailRequest request, SendEmailResponse response) { var assessmentInstance = _assessmentInstanceRepository.GetByKey(request.AssessmentInstanceKey); var patient = _patientRepository.GetByKey(assessmentInstance.PatientKey); var url = string.Format(request.AssessmentInstanceUrl + "/{0}?patientKey={1}", assessmentInstance.Key, assessmentInstance.PatientKey); DateTime?emailSentDate, emailFailedDate; string patientAccountEmail; using (var connection = _dbConnectionFactory.CreateConnection()) { patientAccountEmail = connection.Query <string> ("SELECT Email FROM SecurityModule.SystemAccount WHERE PatientKey=@PatientKey", new { assessmentInstance.PatientKey }) .FirstOrDefault(); } if (patientAccountEmail != null) { var emailMessage = new EmailMessage(); emailMessage.ToAddresses.Add(patientAccountEmail); emailMessage.Body = string.Format(AssessmentResources.SelfAdministrableAssessmentCreatedEmailBody, patient.Name.FirstName, url); emailMessage.Subject = AssessmentResources.SelfAdministrableAssessmentCreatedEmailSubject; emailMessage.IsHtml = true; var emailNotifier = IoC.CurrentContainer.Resolve <IEmailNotifier> (); var isEmailNotificationSuccessful = emailNotifier.Send(emailMessage); if (isEmailNotificationSuccessful) { emailSentDate = DateTime.Now; emailFailedDate = null; } else { emailSentDate = assessmentInstance.EmailSentDate; emailFailedDate = DateTime.Now; } } else { emailSentDate = assessmentInstance.EmailSentDate; emailFailedDate = DateTime.Now; } assessmentInstance.UpdateEmailSentDate(emailSentDate, emailFailedDate); response.EmailSentDate = emailSentDate; response.EmailFailedDate = emailFailedDate; }
/// <summary>Generates the specified key.</summary> /// <param name="key">The key.</param> /// <param name="reportName">Name of the report.</param> /// <param name="parameters">The parameters.</param> /// <returns>A <see cref="IReport" />.</returns> /// <exception cref="System.ArgumentException">Invalid parameters.</exception> public IReport Generate(Guid key, string reportName, object parameters = null) { var assessment = _assessmentInstanceRepository.GetByKey(key); var patient = _patientRepository.GetByKey(assessment.PatientKey); var staff = _staffRepository.GetByKey(assessment.CreatedByStaffKey.GetValueOrDefault()); _youthPediatricSymptonChecklist = new YouthPediatricSymptonChecklist(assessment); _youthPediatricSymptonChecklistReportData = new YouthPediatricSymptonChecklistReportData(_youthPediatricSymptonChecklist); PopulateReportData(patient, staff); var reportDataCollection = new PediatricSymptonChecklistReportDataCollection { _youthPediatricSymptonChecklistReportData }; var report = new YouthPediatricSymptonChecklistReport { DataSource = reportDataCollection, }; return(report); }
protected override void Handle(SaveAssessmentItemRequest request, SaveAssessmentItemResponse response) { var assessmentInstance = _assessmentInstanceRepository.GetByKey(request.Key); var assessmentDefinition = _assessmentDefinitionRepository.GetByKey(assessmentInstance.AssessmentDefinitionKey); var item = assessmentInstance.ItemInstances.FirstOrDefault(i => i.ItemDefinitionCode == request.Item.ItemDefinitionCode); var value = request.Item.Value; if (value is LookupDto) { var lookupDto = value as LookupDto; if (string.IsNullOrWhiteSpace(lookupDto.Code)) { value = null; } else { var itemDefinition = assessmentDefinition.GetItemDefinitionByCode(request.Item.ItemDefinitionCode); value = itemDefinition.Options.Single(l => l.CodedConcept.Code == lookupDto.Code); } } var hasItemUpdated = HasItemUpdated(item, value); if (hasItemUpdated) { if (value != null) { value = string.IsNullOrEmpty(value.ToString()) ? null : value; } assessmentInstance.UpdateItem(request.Item.ItemDefinitionCode, value); } var completenessResults = _assessmentCompletenessManager.CalculateCompleteness(CompletenessCategory.Report, assessmentInstance, assessmentDefinition); assessmentInstance.UpdatePercentComplete(completenessResults.PercentComplete); response.CanSubmit = !assessmentInstance.IsSubmitted && completenessResults.NumberIncomplete == 0; }
/// <summary> /// Initializes a new instance of the <see cref="NidaWorkflowRuleCollection"/> class. /// </summary> /// <param name="assessmentDefinitionRepository">The assessment definition repository.</param> /// <param name="repository">The repository.</param> /// <param name="assessmentInstanceRepository">The assessment instance repository.</param> /// <param name="resourcesManager">The resources manager.</param> public NidaWorkflowRuleCollection( IAssessmentDefinitionRepository assessmentDefinitionRepository, IWorkflowMessageRepository repository, IAssessmentInstanceRepository assessmentInstanceRepository, IResourcesManager resourcesManager = null) { _resourcesManager = resourcesManager; NewRule(() => ShouldRecommendDastRule).When(assessment => (int)assessment.Score.Value > 0) .Then( (assessment, ctx) => { var messageReporter = ctx.WorkingMemory.GetContextObject <IMessageCollector> ("MessageCollector"); var assessmentDefinitionKey = assessmentDefinitionRepository.GetKeyByCode(DrugAbuseScreeningTest.AssessmentCodedConcept.Code); WorkflowMessage message = null; if (assessment.WorkflowKey.HasValue) { message = repository.GetByKey(assessment.WorkflowKey.Value); } message = message ?? new WorkflowMessage( assessment.PatientKey, assessment.Key, NidaSingleQuestionScreener.AssessmentCodedConcept.Code, assessmentDefinitionKey, DrugAbuseScreeningTest.AssessmentCodedConcept.Code, assessment.Score); if (assessment.CanSelfAdminister) { message.AllowSelfAdministration(); } assessment.AddToWorkflow(message.Key); messageReporter.AddMessage(message); }) .ElseThen( (assessment, ctx) => { WorkflowMessage message = null; if (assessment.WorkflowKey.HasValue) { message = repository.GetByKey(assessment.WorkflowKey.Value); } message = message ?? new WorkflowMessage( assessment.PatientKey, assessment.Key, NidaSingleQuestionScreener.AssessmentCodedConcept.Code, Guid.Empty, null, assessment.Score); if (assessment.CanSelfAdminister) { message.AllowSelfAdministration(); } message.Complete(NidaPatientSummaryReportModelBuilder.GetGreenReportModel()); }); NewRuleSet(() => NidaSingleQuestionScreenerRuleSet, ShouldRecommendDastRule); NewRule(() => ShouldRecommendNidaAssessFurtherRule).When(assessment => assessment.WorkflowKey.HasValue) .Then( (assessment, ctx) => { var messageReporter = ctx.WorkingMemory .GetContextObject <IMessageCollector> ("MessageCollector"); var assessmentDefinitionKey = assessmentDefinitionRepository.GetKeyByCode(NidaAssessFurther.AssessmentCodedConcept.Code); var message = repository.GetByKey(assessment.WorkflowKey.Value); message.Advance( assessment.Key, DrugAbuseScreeningTest.AssessmentCodedConcept.Code, assessmentDefinitionKey, NidaAssessFurther.AssessmentCodedConcept.Code, assessment.Score); messageReporter.AddMessage(message); }); NewRuleSet(() => DrugAbuseScreeningTestRuleSet, ShouldRecommendNidaAssessFurtherRule); NewRule(() => ShouldCompleteWorkflowStatusRule).When(assessment => assessment.WorkflowKey.HasValue) .Then( (assessment, ctx) => { var message = repository.GetByKey(assessment.WorkflowKey.Value); var dastKey = message.GetAssessmentKeyforCodeInWorkflow(DrugAbuseScreeningTest.AssessmentCodedConcept.Code); var dastInstance = assessmentInstanceRepository.GetByKey(dastKey.Value); ReportModel reportModel; if (((long)dastInstance.Score.Value) <= 2 && !(((NidaAssessFurtherScoring)assessment.Score.Value).TotalScore)) { reportModel = NidaPatientSummaryReportModelBuilder.GetAmberReportModel( _resourcesManager, dastInstance, assessment); } else { reportModel = NidaPatientSummaryReportModelBuilder.GetRedReportModel( _resourcesManager, dastInstance, assessment); } message.Complete(reportModel); }); NewRuleSet(() => NidaAssessFurtherRuleSet, ShouldCompleteWorkflowStatusRule); }
private void InsertResponses(AssessmentSubmittedEvent message) { var instance = _assessmentInstanceRepository.GetByKey(message.Key); const string Cmd = @"INSERT [AssessmentModule].[AssessmentInstanceResponse] ([AssessmentInstanceKey] ,[AssessmentName] ,[AssessmentCode] ,[AssessmentDefinitionKey] ,[OrganizationKey] ,[PatientKey] ,[ItemDefinitionCode] ,[ResponseType] ,[ResponseValue] ,[IsCode] ,[CodeValue]) VALUES ( "; using (var connection = _connectionFactory.CreateConnection()) { var assessmentCode = string.Empty; var assessmentDefinitionKey = string.Empty; var sql = "SELECT AssessmentDefinitionKey AS [Key], AssessmentCode FROM [AssessmentModule].[AssessmentDefinition] WHERE [AssessmentDefinitionKey]='" + message.AssessmentDefinitionKey + "'"; var rows = connection.Query <AssessmentDefinitionDto>(sql).ToList(); if (rows.Any()) { assessmentCode = rows.ElementAt(0).AssessmentCode; assessmentDefinitionKey = rows.ElementAt(0).Key.ToString(); } var assessmentDefinition = _assessmentDefinitionRepository.GetByKey(_assessmentDefinitionRepository.GetKeyByCode(assessmentCode)); var items = assessmentDefinition.GetAllItemDefinitionsOfType(ItemType.Question).ToList(); foreach (var item in instance.ItemInstances) { var isCode = false; var val = item.Value; int intVal = 0; var responseType = GetTemplateName(items, item); switch (responseType) { case "LookupDto": int.TryParse(((Lookup)item.Value).Value.ToString(), out intVal); val = ((Lookup)item.Value).CodedConcept.Code; responseType = item.Value.GetType().Name; isCode = true; break; case "MultipleSelect": foreach (var option in (IEnumerable <Lookup>)item.Value) { if (((IEnumerable <Lookup>)item.Value).Any()) { responseType = ((IEnumerable <Lookup>)item.Value).ElementAt(0).GetType().Name; int.TryParse(option.Value.ToString(), out intVal); } var fullQueryOption = Cmd + "'" + message.Key + "'," + "'" + instance.AssessmentName + "'," + "'" + assessmentCode + "'," + "'" + assessmentDefinitionKey + "'," + "'" + message.OrganizationKey + "'," + "'" + instance.PatientKey + "'," + "'" + item.ItemDefinitionCode + "'," + "'" + responseType + "'," + "'" + option.CodedConcept.Code + "'," + "'" + true + "'," + intVal + ")"; _logger.Info("InsertResponses Query: {0}", fullQueryOption); connection.Execute(fullQueryOption); } continue; } var fullQuery = Cmd + "'" + message.Key + "'," + "'" + instance.AssessmentName + "'," + "'" + assessmentCode + "'," + "'" + assessmentDefinitionKey + "'," + "'" + message.OrganizationKey + "'," + "'" + instance.PatientKey + "'," + "'" + item.ItemDefinitionCode + "'," + "'" + responseType + "'," + "'" + val + "'," + "'" + isCode + "'," + intVal + ")"; _logger.Info("InsertResponses Query: {0}", fullQuery); connection.Execute(fullQuery); } } }
private void UpdateReportData(AssessmentScoredEvent message) { var assessment = _assessmentInstanceRepository.GetByKey(message.Key); if (!assessment.IsSubmitted) { return; } var assessmentDefinition = _assessmentDefinitionRepository.GetByKey(assessment.AssessmentDefinitionKey); if (assessmentDefinition.ScoreType == ScoreTypeEnum.NoScore) { return; } var patient = _patientRepository.GetByKey(assessment.PatientKey); var previousScore = GetPreviousPatientScore(assessmentDefinition, patient.Key); var scoreChanged = ReadSideService.FirstTime; if (previousScore != null && assessmentDefinition.ScoreType == ScoreTypeEnum.ScoreTypeInt) { if (int.Parse(assessment.Score.Value.ToString()) > int.Parse(previousScore)) { scoreChanged = ReadSideService.Higher; } else if (int.Parse(assessment.Score.Value.ToString()) < int.Parse(previousScore)) { scoreChanged = ReadSideService.Lower; } else if (int.Parse(assessment.Score.Value.ToString()) == int.Parse(previousScore)) { scoreChanged = ReadSideService.NoChange; } } else if (previousScore != null && assessmentDefinition.ScoreType == ScoreTypeEnum.ScoreTypeBoolean) { if (!bool.Parse(assessment.Score.Value.ToString()).Equals(bool.Parse(previousScore))) { scoreChanged = ReadSideService.Higher; } else if (bool.Parse(assessment.Score.Value.ToString()).Equals(bool.Parse(previousScore))) { scoreChanged = ReadSideService.NoChange; } } using (var connection = _connectionFactory.CreateConnection()) { connection.Execute( @"INSERT INTO ReportModule.PatientScoreRangeReport ( AssessmentInstanceKey, PatientKey, AssessmentName, AssessmentScore, ScoreDate, PatientBirthDate, PatientFirstName, PatientLastName, PatientGender,ScoreChange, AssessmentCode) VALUES( @AssessmentInstanceKey, @PatientKey, @AssessmentName, @AssessmentScore, @ScoreDate, @PatientBirthDate, @PatientFirstName, @PatientLastName, @PatientGender, @ScoreChange, @AssessmentCode)", new { AssessmentInstanceKey = assessment.Key, assessment.PatientKey, assessment.AssessmentName, AssessmentScore = message.Value.ToString(), ScoreDate = assessment.SubmittedDate, PatientBirthDate = patient.DateOfBirth.GetValueOrDefault(), PatientFirstName = patient.Name.FirstName, PatientLastName = patient.Name.LastName, PatientGender = patient.Gender.CodedConcept.Name, ScoreChange = scoreChanged, AssessmentCode = assessmentDefinition.CodedConcept.Code }); } }