private static OperationData Capture(DiscontinueModalityPerformedProcedureStepRequest request, IPersistenceContext persistenceContext)
            {
                var mpps           = persistenceContext.Load <ModalityPerformedProcedureStep>(request.Mpps.ModalityPerformendProcedureStepRef, EntityLoadFlags.None);
                var procedures     = mpps.Activities.Select(a => a.Downcast <ModalityProcedureStep>().Procedure).ToList();
                var order          = procedures.First().Order;
                var patientProfile = procedures.First().PatientProfile;

                return(new OperationData(Operations.Discontinue, patientProfile, order, procedures));
            }
        private void DiscontinuePerformedProcedureStep()
        {
            // bail if no selected step (this shouldn't ever happen)
            if (_selectedMpps == null)
            {
                return;
            }

            // confirm with user that they really want to do this
            if (this.Host.DesktopWindow.ShowMessageBox(SR.MessageConfirmDiscontinueSelectedProcedures,
                                                       MessageBoxActions.YesNo) == DialogBoxAction.No)
            {
                return;
            }

            // if downtime recovery mode, need to get the time from the user
            DateTime?endTime = _selectedMpps.StartTime;

            if (DowntimeRecovery.InDowntimeRecoveryMode)
            {
                if (!DateTimeEntryComponent.PromptForTime(this.Host.DesktopWindow, SR.TitleDiscontinuedTime, false, ref endTime))
                {
                    return;
                }
            }

            try
            {
                SaveData();

                DiscontinueModalityPerformedProcedureStepResponse response = null;
                Platform.GetService <IModalityWorkflowService>(
                    service =>
                {
                    var request = new DiscontinueModalityPerformedProcedureStepRequest(_selectedMpps)
                    {
                        DiscontinuedTime = DowntimeRecovery.InDowntimeRecoveryMode ? endTime : null
                    };
                    response = service.DiscontinueModalityPerformedProcedureStep(request);
                });

                RefreshProcedurePlanTree(response.ProcedurePlan);

                _mppsTable.Items.Replace(
                    mpps => mpps.ModalityPerformendProcedureStepRef.Equals(_selectedMpps.ModalityPerformendProcedureStepRef, true),
                    response.DiscontinuedMpps);

                // Refresh selection
                _selectedMpps = response.DiscontinuedMpps;
                UpdateActionEnablement();
                _mppsTable.Sort();

                // notify pages that selection has been updated
                EventsHelper.Fire(_selectedMppsChanged, this, EventArgs.Empty);

                NotifyPerformedProcedureStepComplete();
            }
            catch (Exception e)
            {
                ExceptionHandler.Report(e, this.Host.DesktopWindow);
            }
        }
        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)));
        }