public CompleteModalityPerformedProcedureStepResponse CompleteModalityPerformedProcedureStep(CompleteModalityPerformedProcedureStepRequest request)
        {
            var mpps = this.PersistenceContext.Load <ModalityPerformedProcedureStep>(request.Mpps.ModalityPerformendProcedureStepRef);

            // update extended properties (should this be in an assembler?)
            ExtendedPropertyUtils.Update(mpps.ExtendedProperties, request.Mpps.ExtendedProperties);

            var dicomSeriesAssembler = new DicomSeriesAssembler();

            dicomSeriesAssembler.SynchronizeDicomSeries(mpps, request.Mpps.DicomSeries, this.PersistenceContext);

            var op = new CompleteModalityPerformedProcedureStepOperation();

            op.Execute(mpps, request.CompletedTime, new PersistentWorkflow(PersistenceContext));

            this.PersistenceContext.SynchState();

            // Drill back to order so we can refresh procedure plan
            var onePs = CollectionUtils.FirstElement(mpps.Activities).As <ProcedureStep>();

            var planAssembler = new ProcedurePlanAssembler();
            var stepAssembler = new ModalityPerformedProcedureStepAssembler();

            return(new CompleteModalityPerformedProcedureStepResponse(
                       planAssembler.CreateProcedurePlanSummary(onePs.Procedure.Order, this.PersistenceContext),
                       stepAssembler.CreateModalityPerformedProcedureStepDetail(mpps, this.PersistenceContext)));
        }
        public GetProcedurePlanResponse GetProcedurePlan(GetProcedurePlanRequest request)
        {
            var order     = this.PersistenceContext.Load <Order>(request.OrderRef);
            var assembler = new ProcedurePlanAssembler();

            return(new GetProcedurePlanResponse(assembler.CreateProcedurePlanSummary(order, this.PersistenceContext)));
        }
        public DiscontinueModalityProcedureStepsResponse DiscontinueModalityProcedureSteps(DiscontinueModalityProcedureStepsRequest request)
        {
            Platform.CheckForNullReference(request, "request");
            Platform.CheckMemberIsSet(request.ModalityProcedureSteps, "ModalityProcedureSteps");

            // load the set of mps
            var modalitySteps = CollectionUtils.Map <EntityRef, ModalityProcedureStep>(
                request.ModalityProcedureSteps,
                mpsRef => this.PersistenceContext.Load <ModalityProcedureStep>(mpsRef));

            foreach (var step in modalitySteps)
            {
                var op = new DiscontinueModalityProcedureStepOperation();
                op.Execute(step, request.DiscontinuedTime, new PersistentWorkflow(this.PersistenceContext));

                // If discontinuing the procedure step caused the parent procedure to be discontinued,
                // create an HL7 event.
                if (step.Procedure.IsTerminated)
                {
                    LogicalHL7Event.ProcedureCancelled.EnqueueEvents(step.Procedure);
                }
            }

            this.PersistenceContext.SynchState();

            var assembler = new ProcedurePlanAssembler();

            return(new DiscontinueModalityProcedureStepsResponse(
                       assembler.CreateProcedurePlanSummary(modalitySteps[0].Procedure.Order, this.PersistenceContext)));
        }
        public StartModalityProcedureStepsResponse StartModalityProcedureSteps(StartModalityProcedureStepsRequest request)
        {
            Platform.CheckForNullReference(request, "request");
            Platform.CheckMemberIsSet(request.ModalityProcedureSteps, "ModalityProcedureSteps");

            // load the set of mps
            var modalitySteps = CollectionUtils.Map <EntityRef, ModalityProcedureStep>(
                request.ModalityProcedureSteps,
                mpsRef => this.PersistenceContext.Load <ModalityProcedureStep>(mpsRef));

            var hasProcedureNotCheckedIn = CollectionUtils.Contains(
                modalitySteps,
                mps => mps.Procedure.IsPreCheckIn);

            if (hasProcedureNotCheckedIn)
            {
                throw new RequestValidationException(SR.ExceptionProcedureNotCheckedIn);
            }

            var op   = new StartModalityProcedureStepsOperation();
            var mpps = op.Execute(modalitySteps, request.StartTime, this.CurrentUserStaff, new PersistentWorkflow(PersistenceContext));

            this.PersistenceContext.SynchState();

            var procedurePlanAssembler = new ProcedurePlanAssembler();
            var mppsAssembler          = new ModalityPerformedProcedureStepAssembler();

            return(new StartModalityProcedureStepsResponse(
                       procedurePlanAssembler.CreateProcedurePlanSummary(modalitySteps[0].Procedure.Order, this.PersistenceContext),
                       mppsAssembler.CreateModalityPerformedProcedureStepDetail(mpps, this.PersistenceContext)));
        }
        public GetProcedurePlanForProtocollingWorklistItemResponse GetProcedurePlanForProtocollingWorklistItem(GetProcedurePlanForProtocollingWorklistItemRequest request)
        {
            var order = this.PersistenceContext.Load <Order>(request.OrderRef);

            var assembler            = new ProcedurePlanAssembler();
            var procedurePlanSummary = assembler.CreateProcedurePlanSummary(order, this.PersistenceContext);

            return(new GetProcedurePlanForProtocollingWorklistItemResponse(procedurePlanSummary));
        }
        public SaveOrderDocumentationDataResponse SaveOrderDocumentationData(SaveOrderDocumentationDataRequest request)
        {
            var order = this.PersistenceContext.Load <Order>(request.OrderRef);

            ExtendedPropertyUtils.Update(order.ExtendedProperties, request.OrderExtendedProperties);

            var dicomSeriesAssembler = new DicomSeriesAssembler();

            foreach (var detail in request.ModalityPerformedProcedureSteps)
            {
                var mpps = this.PersistenceContext.Load <ModalityPerformedProcedureStep>(detail.ModalityPerformendProcedureStepRef);
                ExtendedPropertyUtils.Update(mpps.ExtendedProperties, detail.ExtendedProperties);
                dicomSeriesAssembler.SynchronizeDicomSeries(mpps, detail.DicomSeries, this.PersistenceContext);
            }

            // add new order notes
            var noteAssembler = new OrderNoteAssembler();

            noteAssembler.SynchronizeOrderNotes(order, request.OrderNotes, CurrentUserStaff, this.PersistenceContext);

            // assign all procedures for this order to the specified interpreter (or unassign them, if null)
            var interpreter = request.AssignedInterpreter == null
                                ? null
                                : this.PersistenceContext.Load <Staff>(request.AssignedInterpreter.StaffRef, EntityLoadFlags.Proxy);

            foreach (var procedure in order.Procedures)
            {
                if (procedure.IsPerformed)
                {
                    var interpretationStep = GetPendingInterpretationStep(procedure);
                    if (interpretationStep != null)
                    {
                        interpretationStep.Assign(interpreter);
                    }
                }
            }

            this.PersistenceContext.SynchState();

            var planAssembler = new ProcedurePlanAssembler();

            return(new SaveOrderDocumentationDataResponse(planAssembler.CreateProcedurePlanSummary(order, this.PersistenceContext)));
        }
        public CompleteOrderDocumentationResponse CompleteOrderDocumentation(CompleteOrderDocumentationRequest request)
        {
            var order = this.PersistenceContext.Load <Order>(request.OrderRef);

            var interpretationSteps = new List <InterpretationStep>();

            foreach (var procedure in order.Procedures)
            {
                if (procedure.DocumentationProcedureStep != null && !procedure.DocumentationProcedureStep.IsTerminated)
                {
                    procedure.DocumentationProcedureStep.Complete();
                }

                // schedule the interpretation step if the procedure was performed
                // Note: this logic is probably UHN-specific... ideally this aspect of the workflow should be configurable,
                // because it may be desirable to scheduled the interpretation prior to completing the documentation
                if (procedure.IsPerformed)
                {
                    var interpretationStep = GetPendingInterpretationStep(procedure);
                    if (interpretationStep != null)
                    {
                        // bug #3037: schedule the interpretation for the performed time, which may be earlier than the current time
                        // in downtime mode
                        interpretationStep.Schedule(procedure.PerformedTime);
                        interpretationSteps.Add(interpretationStep);
                    }
                }
            }

            this.PersistenceContext.SynchState();

            var planAssembler = new ProcedurePlanAssembler();

            return(new CompleteOrderDocumentationResponse
            {
                ProcedurePlan = planAssembler.CreateProcedurePlanSummary(order, this.PersistenceContext),
                InterpretationStepRefs = CollectionUtils.Map <InterpretationStep, EntityRef>(interpretationSteps, step => step.GetRef())
            });
        }
        public DiscontinueModalityPerformedProcedureStepResponse DiscontinueModalityPerformedProcedureStep(DiscontinueModalityPerformedProcedureStepRequest request)
        {
            var mpps = this.PersistenceContext.Load <ModalityPerformedProcedureStep>(request.Mpps.ModalityPerformendProcedureStepRef);

            // update extended properties (should this be in an assembler?)
            ExtendedPropertyUtils.Update(mpps.ExtendedProperties, request.Mpps.ExtendedProperties);

            var dicomSeriesAssembler = new DicomSeriesAssembler();

            dicomSeriesAssembler.SynchronizeDicomSeries(mpps, request.Mpps.DicomSeries, this.PersistenceContext);

            var op = new DiscontinueModalityPerformedProcedureStepOperation();

            op.Execute(mpps, request.DiscontinuedTime, new PersistentWorkflow(PersistenceContext));

            this.PersistenceContext.SynchState();

            // If discontinuing the MPPS caused any associated procedures to be discontinued,
            // create an HL7 event.
            foreach (var activity in mpps.Activities)
            {
                var procedure = activity.As <ProcedureStep>().Procedure;
                if (procedure.IsTerminated)
                {
                    LogicalHL7Event.ProcedureCancelled.EnqueueEvents(procedure);
                }
            }

            // Drill back to order so we can refresh procedure plan
            var order = CollectionUtils.FirstElement(mpps.Activities).As <ProcedureStep>().Procedure.Order;

            var planAssembler = new ProcedurePlanAssembler();
            var stepAssembler = new ModalityPerformedProcedureStepAssembler();

            return(new DiscontinueModalityPerformedProcedureStepResponse(
                       planAssembler.CreateProcedurePlanSummary(order, this.PersistenceContext),
                       stepAssembler.CreateModalityPerformedProcedureStepDetail(mpps, this.PersistenceContext)));
        }
Beispiel #9
0
		public GetProcedurePlanResponse GetProcedurePlan(GetProcedurePlanRequest request)
		{
			var order = this.PersistenceContext.Load<Order>(request.OrderRef);
			var assembler = new ProcedurePlanAssembler();
			return new GetProcedurePlanResponse(assembler.CreateProcedurePlanSummary(order, this.PersistenceContext));
		}
Beispiel #10
0
		public CompleteOrderDocumentationResponse CompleteOrderDocumentation(CompleteOrderDocumentationRequest request)
		{
			var order = this.PersistenceContext.Load<Order>(request.OrderRef);

			var interpretationSteps = new List<InterpretationStep>();
			foreach (var procedure in order.Procedures)
			{
				if (procedure.DocumentationProcedureStep != null && !procedure.DocumentationProcedureStep.IsTerminated)
				{
					procedure.DocumentationProcedureStep.Complete();
				}

				// schedule the interpretation step if the procedure was performed
				// Note: this logic is probably UHN-specific... ideally this aspect of the workflow should be configurable,
				// because it may be desirable to scheduled the interpretation prior to completing the documentation
				if (procedure.IsPerformed)
				{
					var interpretationStep = GetPendingInterpretationStep(procedure);
					if (interpretationStep != null)
					{
						// bug #3037: schedule the interpretation for the performed time, which may be earlier than the current time 
						// in downtime mode
						interpretationStep.Schedule(procedure.PerformedTime);
						interpretationSteps.Add(interpretationStep);
					}
				}
			}

			this.PersistenceContext.SynchState();

			var planAssembler = new ProcedurePlanAssembler();
			return new CompleteOrderDocumentationResponse
			{
				ProcedurePlan = planAssembler.CreateProcedurePlanSummary(order, this.PersistenceContext),
				InterpretationStepRefs = CollectionUtils.Map<InterpretationStep, EntityRef>(interpretationSteps, step => step.GetRef())
			};
		}
Beispiel #11
0
		public SaveOrderDocumentationDataResponse SaveOrderDocumentationData(SaveOrderDocumentationDataRequest request)
		{
			var order = this.PersistenceContext.Load<Order>(request.OrderRef);

			ExtendedPropertyUtils.Update(order.ExtendedProperties, request.OrderExtendedProperties);

			var dicomSeriesAssembler = new DicomSeriesAssembler();
			foreach (var detail in request.ModalityPerformedProcedureSteps)
			{
				var mpps = this.PersistenceContext.Load<ModalityPerformedProcedureStep>(detail.ModalityPerformendProcedureStepRef);
				ExtendedPropertyUtils.Update(mpps.ExtendedProperties, detail.ExtendedProperties);
				dicomSeriesAssembler.SynchronizeDicomSeries(mpps, detail.DicomSeries, this.PersistenceContext);
			}

			// add new order notes
			var noteAssembler = new OrderNoteAssembler();
			noteAssembler.SynchronizeOrderNotes(order, request.OrderNotes, CurrentUserStaff, this.PersistenceContext);

			// assign all procedures for this order to the specified interpreter (or unassign them, if null)
			var interpreter = request.AssignedInterpreter == null
				? null
				: this.PersistenceContext.Load<Staff>(request.AssignedInterpreter.StaffRef, EntityLoadFlags.Proxy);
			foreach (var procedure in order.Procedures)
			{
				if (procedure.IsPerformed)
				{
					var interpretationStep = GetPendingInterpretationStep(procedure);
					if (interpretationStep != null)
					{
						interpretationStep.Assign(interpreter);
					}
				}
			}

			this.PersistenceContext.SynchState();

			var planAssembler = new ProcedurePlanAssembler();
			return new SaveOrderDocumentationDataResponse(planAssembler.CreateProcedurePlanSummary(order, this.PersistenceContext));
		}
Beispiel #12
0
		public DiscontinueModalityPerformedProcedureStepResponse DiscontinueModalityPerformedProcedureStep(DiscontinueModalityPerformedProcedureStepRequest request)
		{
			var mpps = this.PersistenceContext.Load<ModalityPerformedProcedureStep>(request.Mpps.ModalityPerformendProcedureStepRef);

			// update extended properties (should this be in an assembler?)
			ExtendedPropertyUtils.Update(mpps.ExtendedProperties, request.Mpps.ExtendedProperties);

			var dicomSeriesAssembler = new DicomSeriesAssembler();
			dicomSeriesAssembler.SynchronizeDicomSeries(mpps, request.Mpps.DicomSeries, this.PersistenceContext);

			var op = new DiscontinueModalityPerformedProcedureStepOperation();
			op.Execute(mpps, request.DiscontinuedTime, new PersistentWorkflow(PersistenceContext));

			this.PersistenceContext.SynchState();

			// If discontinuing the MPPS caused any associated procedures to be discontinued,
			// create an HL7 event.
			foreach (var activity in mpps.Activities)
			{
				var procedure = activity.As<ProcedureStep>().Procedure;
				if(procedure.IsTerminated)
					LogicalHL7Event.ProcedureCancelled.EnqueueEvents(procedure);
			}
	
			// Drill back to order so we can refresh procedure plan
			var order = CollectionUtils.FirstElement(mpps.Activities).As<ProcedureStep>().Procedure.Order;

			var planAssembler = new ProcedurePlanAssembler();
			var stepAssembler = new ModalityPerformedProcedureStepAssembler();
			return new DiscontinueModalityPerformedProcedureStepResponse(
				planAssembler.CreateProcedurePlanSummary(order, this.PersistenceContext),
				stepAssembler.CreateModalityPerformedProcedureStepDetail(mpps, this.PersistenceContext));
		}
Beispiel #13
0
		public CompleteModalityPerformedProcedureStepResponse CompleteModalityPerformedProcedureStep(CompleteModalityPerformedProcedureStepRequest request)
		{
			var mpps = this.PersistenceContext.Load<ModalityPerformedProcedureStep>(request.Mpps.ModalityPerformendProcedureStepRef);

			// update extended properties (should this be in an assembler?)
			ExtendedPropertyUtils.Update(mpps.ExtendedProperties, request.Mpps.ExtendedProperties);

			var dicomSeriesAssembler = new DicomSeriesAssembler();
			dicomSeriesAssembler.SynchronizeDicomSeries(mpps, request.Mpps.DicomSeries, this.PersistenceContext);

			var op = new CompleteModalityPerformedProcedureStepOperation();
			op.Execute(mpps, request.CompletedTime, new PersistentWorkflow(PersistenceContext));

			this.PersistenceContext.SynchState();

			// Drill back to order so we can refresh procedure plan
			var onePs = CollectionUtils.FirstElement(mpps.Activities).As<ProcedureStep>();

			var planAssembler = new ProcedurePlanAssembler();
			var stepAssembler = new ModalityPerformedProcedureStepAssembler();
			return new CompleteModalityPerformedProcedureStepResponse(
				planAssembler.CreateProcedurePlanSummary(onePs.Procedure.Order, this.PersistenceContext),
				stepAssembler.CreateModalityPerformedProcedureStepDetail(mpps, this.PersistenceContext));
		}
Beispiel #14
0
		public DiscontinueModalityProcedureStepsResponse DiscontinueModalityProcedureSteps(DiscontinueModalityProcedureStepsRequest request)
		{
			Platform.CheckForNullReference(request, "request");
			Platform.CheckMemberIsSet(request.ModalityProcedureSteps, "ModalityProcedureSteps");

			// load the set of mps
			var modalitySteps = CollectionUtils.Map<EntityRef, ModalityProcedureStep>(
				request.ModalityProcedureSteps,
				mpsRef => this.PersistenceContext.Load<ModalityProcedureStep>(mpsRef));

			foreach (var step in modalitySteps)
			{
				var op = new DiscontinueModalityProcedureStepOperation();
				op.Execute(step, request.DiscontinuedTime, new PersistentWorkflow(this.PersistenceContext));

				// If discontinuing the procedure step caused the parent procedure to be discontinued,
				// create an HL7 event.
				if (step.Procedure.IsTerminated)
					LogicalHL7Event.ProcedureCancelled.EnqueueEvents(step.Procedure);
			}

			this.PersistenceContext.SynchState();

			var assembler = new ProcedurePlanAssembler();
			return new DiscontinueModalityProcedureStepsResponse(
				assembler.CreateProcedurePlanSummary(modalitySteps[0].Procedure.Order, this.PersistenceContext));
		}
Beispiel #15
0
		public StartModalityProcedureStepsResponse StartModalityProcedureSteps(StartModalityProcedureStepsRequest request)
		{
			Platform.CheckForNullReference(request, "request");
			Platform.CheckMemberIsSet(request.ModalityProcedureSteps, "ModalityProcedureSteps");

			// load the set of mps
			var modalitySteps = CollectionUtils.Map<EntityRef, ModalityProcedureStep>(
				request.ModalityProcedureSteps,
				mpsRef => this.PersistenceContext.Load<ModalityProcedureStep>(mpsRef));

			var hasProcedureNotCheckedIn = CollectionUtils.Contains(
				modalitySteps,
				mps => mps.Procedure.IsPreCheckIn);

			if (hasProcedureNotCheckedIn)
				throw new RequestValidationException(SR.ExceptionProcedureNotCheckedIn);

			var op = new StartModalityProcedureStepsOperation();
			var mpps = op.Execute(modalitySteps, request.StartTime, this.CurrentUserStaff, new PersistentWorkflow(PersistenceContext));

			this.PersistenceContext.SynchState();

			var procedurePlanAssembler = new ProcedurePlanAssembler();
			var mppsAssembler = new ModalityPerformedProcedureStepAssembler();
			return new StartModalityProcedureStepsResponse(
				procedurePlanAssembler.CreateProcedurePlanSummary(modalitySteps[0].Procedure.Order, this.PersistenceContext),
				mppsAssembler.CreateModalityPerformedProcedureStepDetail(mpps, this.PersistenceContext));
		}