private void StopPerformedProcedureStep()
        {
            // bail if no selected step (this shouldn't ever happen)
            if (_selectedMpps == null)
            {
                return;
            }

            // bail on validation errors
            if (this.HasValidationErrors)
            {
                ShowValidation(true);
                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.TitleCompletedTime, false, ref endTime))
                {
                    return;
                }
            }

            try
            {
                SaveData();

                CompleteModalityPerformedProcedureStepResponse response = null;
                Platform.GetService <IModalityWorkflowService>(
                    service =>
                {
                    var request = new CompleteModalityPerformedProcedureStepRequest(_selectedMpps)
                    {
                        CompletedTime = DowntimeRecovery.InDowntimeRecoveryMode ? endTime : null
                    };
                    response = service.CompleteModalityPerformedProcedureStep(request);
                });

                RefreshProcedurePlanTree(response.ProcedurePlan);

                _mppsTable.Items.Replace(
                    mppsSummary => mppsSummary.ModalityPerformendProcedureStepRef.Equals(_selectedMpps.ModalityPerformendProcedureStepRef, true),
                    response.StoppedMpps);

                // Refresh selection
                _selectedMpps = response.StoppedMpps;
                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 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)));
        }