internal override void ApplyDefaults(ProcedureRequisition procedureRequisition, OrderEditorComponent component)
			{
				if (this.Defaults.ScheduledTime.HasValue)
				{
					procedureRequisition.ScheduledTime = ComputeScheduledTime(this.Defaults.ScheduledTime.Value, component._proceduresTable.Items);
				}

				if (this.Defaults.ModalityRef != null)
				{
					var modality = component._modalityChoices.FirstOrDefault(m => m.ModalityRef.Equals(this.Defaults.ModalityRef, true));
					procedureRequisition.Modality = modality;
				}
			}
			internal override void ApplyDefaults(ProcedureRequisition procedureRequisition, OrderEditorComponent component)
			{
				// apply the defaults iff this requisition is specifically the one that was requested to be edited
				if (!EntityRef.Equals(procedureRequisition.ProcedureRef, this.ProcedureRef, true))
					return;
				if (!procedureRequisition.CanModify)
					return;

				if (this.Defaults.ScheduledTime.HasValue)
				{
					procedureRequisition.ScheduledTime = this.Defaults.ScheduledTime.Value;
				}

				if (this.Defaults.ScheduledDuration.HasValue)
				{
					procedureRequisition.ScheduledDuration = this.Defaults.ScheduledDuration.Value;
				}

				if (this.Defaults.ModalityRef != null)
				{
					var modality = component._modalityChoices.FirstOrDefault(m => m.ModalityRef.Equals(this.Defaults.ModalityRef, true));
					procedureRequisition.Modality = modality;
				}
			}
		public void UpdateProcedureFromRequisition(Procedure procedure, ProcedureRequisition requisition, Staff currentUserStaff, IPersistenceContext context)
		{
			// check if the procedure was cancelled
			if (requisition.Cancelled)
			{
				if (procedure.Status == ProcedureStatus.SC)
				{
					// if RP is still scheduled, cancel it
					procedure.Cancel();
				}
				else if (procedure.Status == ProcedureStatus.IP)
				{
					// if RP in-progress, discontinue it
					procedure.Discontinue();
				}

				// early exit - nothing else to update
				return;
			}

			// The following properties are appropriate only for procedures in SC status.
			if (!IsProcedureModifiable(procedure))
				return;

			procedure.Schedule(requisition.ScheduledTime, requisition.ScheduledDuration);
			procedure.SchedulingCode = EnumUtils.GetEnumValue<SchedulingCodeEnum>(requisition.SchedulingCode, context);

			procedure.PerformingFacility = context.Load<Facility>(requisition.PerformingFacility.FacilityRef, EntityLoadFlags.Proxy);
			procedure.PerformingDepartment = requisition.PerformingDepartment == null ? null
				: context.Load<Department>(requisition.PerformingDepartment.DepartmentRef, EntityLoadFlags.Proxy);

			// if the requisition explicitly specifies a modality, assign that modality to all MPS
			// (we ignore the fact that the procedure plan can theoretically contain modality procedures steps spanning multiple 
			// DICOM modalities, since in the small clinic use-case, each procedure type generally only has a single MPS)
			if (requisition.Modality != null)
			{
				foreach (var mps in procedure.ModalityProcedureSteps)
				{
					mps.Modality = context.Load<Modality>(requisition.Modality.ModalityRef, EntityLoadFlags.Proxy);
				}
			}

			procedure.Laterality = EnumUtils.GetEnumValue<Laterality>(requisition.Laterality);
			procedure.Portable = requisition.PortableModality;

			if (requisition.CheckedIn && procedure.IsPreCheckIn)
			{
				procedure.CheckIn(currentUserStaff, null);
			}
			else if (!requisition.CheckedIn && procedure.IsCheckedIn)
			{
				procedure.RevertCheckIn();
			}
		}
			/// <summary>
			/// Applies default values to the specified procedure requisition.
			/// </summary>
			/// <param name="procedureRequisition"></param>
			/// <param name="component"></param>
			internal abstract void ApplyDefaults(ProcedureRequisition procedureRequisition, OrderEditorComponent component);
		/// <summary>
		/// Formats the procedure name, portable and laterality similar to "Name (Portable/Laterality)".  
		/// Name is formatted according to the default person name format as specified in <see cref="FormatSettings"/>
		/// </summary>
		/// <param name="p"></param>
		/// <returns></returns>
		public static string Format(ProcedureRequisition p)
		{
			return Format(p.ProcedureType.Name, p.PortableModality, p.Laterality, FormatSettings.Default.ProcedurePortableLateralityDefaultFormat);
		}