public GetProcedureTypeGroupSummaryFormDataResponse GetProcedureTypeGroupSummaryFormData(GetProcedureTypeGroupSummaryFormDataRequest request)
		{
			var ptgAssembler = new ProcedureTypeGroupAssembler();
			var subClasses = ProcedureTypeGroup.ListSubClasses(PersistenceContext);

			// Category choices
			return new GetProcedureTypeGroupSummaryFormDataResponse(
				CollectionUtils.Map(subClasses, (Type t) => ptgAssembler.GetCategoryEnumValueInfo(t)));
		}
		public ListProcedureTypeGroupsResponse ListProcedureTypeGroups(
			ListProcedureTypeGroupsRequest request)
		{
			var response = new ListProcedureTypeGroupsResponse();
			var assembler = new ProcedureTypeGroupAssembler();

			var criteria = new ProcedureTypeGroupSearchCriteria();
			criteria.Name.SortAsc(0);
			var result = request.CategoryFilter == null ?
				PersistenceContext.GetBroker<IProcedureTypeGroupBroker>().Find(criteria, request.Page) :
				PersistenceContext.GetBroker<IProcedureTypeGroupBroker>().Find(criteria, Type.GetType(request.CategoryFilter.Code), request.Page);

			response.Items = CollectionUtils.Map(result, (ProcedureTypeGroup rptGroup) =>
												 assembler.GetProcedureTypeGroupSummary(rptGroup, this.PersistenceContext));

			return response;
		}
		public GetProcedureTypeGroupEditFormDataResponse GetProcedureTypeGroupEditFormData(
			GetProcedureTypeGroupEditFormDataRequest request)
		{
			var response = new GetProcedureTypeGroupEditFormDataResponse();
			var ptgAssembler = new ProcedureTypeGroupAssembler();
			var subClasses = ProcedureTypeGroup.ListSubClasses(PersistenceContext);

			// Category choices
			response.Categories = CollectionUtils.Map(subClasses, (Type t) => ptgAssembler.GetCategoryEnumValueInfo(t));

			// ProcedureType choices
			var assembler = new ProcedureTypeAssembler();
			response.ProcedureTypes = CollectionUtils.Map(
				PersistenceContext.GetBroker<IProcedureTypeBroker>().FindAll(request.IncludeDeactivated),
				(ProcedureType rpt) => assembler.CreateSummary(rpt));

			return response;
		}
        public AddProcedureTypeGroupResponse AddProcedureTypeGroup(
            AddProcedureTypeGroupRequest request)
        {
            if (string.IsNullOrEmpty(request.Detail.Name))
            {
                throw new RequestValidationException(SR.ExceptionProcedureTypeGroupNameRequired);
            }

            // create appropriate class of group
            var group     = (ProcedureTypeGroup)Activator.CreateInstance(Type.GetType(request.Detail.Category.Code));
            var assembler = new ProcedureTypeGroupAssembler();

            assembler.UpdateProcedureTypeGroup(group, request.Detail, this.PersistenceContext);

            PersistenceContext.Lock(group, DirtyState.New);
            PersistenceContext.SynchState();

            return(new AddProcedureTypeGroupResponse(
                       assembler.GetProcedureTypeGroupSummary(group, this.PersistenceContext)));
        }
        public ListProcedureTypeGroupsResponse ListProcedureTypeGroups(ListProcedureTypeGroupsRequest request)
        {
            Platform.CheckForNullReference(request, "request");
            Platform.CheckMemberIsSet(request.ProcedureTypeGroupClass, "request.ProcedureTypeGroupClass");

            var procedureTypeGroupClass = ProcedureTypeGroup.GetSubClass(request.ProcedureTypeGroupClass, PersistenceContext);

            if (procedureTypeGroupClass == null)
            {
                throw new ArgumentException("Invalid ProcedureTypeGroupClass name");
            }

            var response = new ListProcedureTypeGroupsResponse();

            var assembler = new ProcedureTypeGroupAssembler();

            response.ProcedureTypeGroups =
                CollectionUtils.Map <ProcedureTypeGroup, ProcedureTypeGroupSummary>(
                    PersistenceContext.GetBroker <IProcedureTypeGroupBroker>().Find(new ProcedureTypeGroupSearchCriteria(), procedureTypeGroupClass),
                    group => assembler.GetProcedureTypeGroupSummary(group, PersistenceContext));

            return(response);
        }
		public AddProcedureTypeGroupResponse AddProcedureTypeGroup(
			AddProcedureTypeGroupRequest request)
		{
			if (string.IsNullOrEmpty(request.Detail.Name))
			{
				throw new RequestValidationException(SR.ExceptionProcedureTypeGroupNameRequired);
			}

			// create appropriate class of group
			var group = (ProcedureTypeGroup)Activator.CreateInstance(Type.GetType(request.Detail.Category.Code));
			var assembler = new ProcedureTypeGroupAssembler();
			assembler.UpdateProcedureTypeGroup(group, request.Detail, this.PersistenceContext);

			PersistenceContext.Lock(group, DirtyState.New);
			PersistenceContext.SynchState();

			return new AddProcedureTypeGroupResponse(
				assembler.GetProcedureTypeGroupSummary(group, this.PersistenceContext));
		}
		public LoadProcedureTypeGroupForEditResponse LoadProcedureTypeGroupForEdit(
			LoadProcedureTypeGroupForEditRequest request)
		{
			var rptGroup = PersistenceContext.GetBroker<IProcedureTypeGroupBroker>().Load(request.EntityRef);
			var assembler = new ProcedureTypeGroupAssembler();
			var detail = assembler.GetProcedureTypeGroupDetail(rptGroup, this.PersistenceContext);
			return new LoadProcedureTypeGroupForEditResponse(rptGroup.GetRef(), detail);
		}
		public UpdateProcedureTypeGroupResponse UpdateProcedureTypeGroup(
			UpdateProcedureTypeGroupRequest request)
		{
			var group = PersistenceContext.Load<ProcedureTypeGroup>(request.EntityRef, EntityLoadFlags.CheckVersion);
			var assembler = new ProcedureTypeGroupAssembler();
			assembler.UpdateProcedureTypeGroup(group, request.Detail, this.PersistenceContext);

			return new UpdateProcedureTypeGroupResponse(
				assembler.GetProcedureTypeGroupSummary(group, this.PersistenceContext));
		}
        /// <summary>
        /// Create worklist detail.
        /// </summary>
        /// <param name="worklist"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        public WorklistAdminDetail CreateWorklistDetail(Worklist worklist, IPersistenceContext context)
        {
            var detail = new WorklistAdminDetail(worklist.GetRef(), worklist.Name, worklist.Description,
                                                 CreateClassSummary(worklist.GetClass()));

            var staffAssembler      = new StaffAssembler();
            var staffGroupAssembler = new StaffGroupAssembler();

            detail.OwnerStaff = worklist.Owner.IsStaffOwner ?
                                staffAssembler.CreateStaffSummary(worklist.Owner.Staff, context) : null;
            detail.OwnerGroup = worklist.Owner.IsGroupOwner ?
                                staffGroupAssembler.CreateSummary(worklist.Owner.Group) : null;

            // proc types
            var ptAssembler = new ProcedureTypeAssembler();

            detail.ProcedureTypes = GetFilterSummary(worklist.ProcedureTypeFilter,
                                                     item => ptAssembler.CreateSummary(item));

            // proc type groups
            var ptgAssembler = new ProcedureTypeGroupAssembler();

            detail.ProcedureTypeGroups = GetFilterSummary(worklist.ProcedureTypeGroupFilter,
                                                          item => ptgAssembler.GetProcedureTypeGroupSummary(item, context));

            // facilities
            var facilityAssembler = new FacilityAssembler();

            detail.Facilities = GetFilterSummary(worklist.FacilityFilter,
                                                 item => facilityAssembler.CreateFacilitySummary(item));
            detail.FilterByWorkingFacility = worklist.FacilityFilter.IsEnabled && worklist.FacilityFilter.IncludeWorkingFacility;

            // departments
            var departmentAssembler = new DepartmentAssembler();

            detail.Departments = GetFilterSummary(worklist.DepartmentFilter,
                                                  item => departmentAssembler.CreateSummary(item, context));

            // patient class
            detail.PatientClasses = GetFilterSummary(worklist.PatientClassFilter,
                                                     item => EnumUtils.GetEnumValueInfo(item));

            // location
            var locationAssembler = new LocationAssembler();

            detail.PatientLocations = GetFilterSummary(worklist.PatientLocationFilter,
                                                       item => locationAssembler.CreateLocationSummary(item));

            // order priority
            detail.OrderPriorities = GetFilterSummary(worklist.OrderPriorityFilter,
                                                      item => EnumUtils.GetEnumValueInfo(item));

            // ordering prac
            var practitionerAssembler = new ExternalPractitionerAssembler();

            detail.OrderingPractitioners = GetFilterSummary(worklist.OrderingPractitionerFilter,
                                                            item => practitionerAssembler.CreateExternalPractitionerSummary(item, context));

            // portable
            if (worklist.PortableFilter.IsEnabled)
            {
                detail.Portabilities = new List <bool> {
                    worklist.PortableFilter.Value
                };
            }

            // time window
            if (worklist.TimeFilter.IsEnabled && worklist.TimeFilter.Value != null)
            {
                if (worklist.TimeFilter.Value.Start != null)
                {
                    detail.StartTime = CreateTimePointContract(worklist.TimeFilter.Value.Start);
                }
                if (worklist.TimeFilter.Value.End != null)
                {
                    detail.EndTime = CreateTimePointContract(worklist.TimeFilter.Value.End);
                }
            }

            detail.StaffSubscribers = CollectionUtils.Map(worklist.StaffSubscribers,
                                                          (Staff staff) => staffAssembler.CreateStaffSummary(staff, context));

            detail.GroupSubscribers = CollectionUtils.Map(worklist.GroupSubscribers,
                                                          (StaffGroup group) => staffGroupAssembler.CreateSummary(group));

            // Some ReportingWorklists can support staff role filters, if that is true for this worklist,
            // add those filters to the WorklistAdminDetail
            if (Worklist.GetSupportsReportingStaffRoleFilter(worklist.GetClass()))
            {
                var reportingWorklist = worklist.As <ReportingWorklist>();
                detail.InterpretedByStaff = GetFilterSummary(reportingWorklist.InterpretedByStaffFilter, context);
                detail.TranscribedByStaff = GetFilterSummary(reportingWorklist.TranscribedByStaffFilter, context);
                detail.VerifiedByStaff    = GetFilterSummary(reportingWorklist.VerifiedByStaffFilter, context);
                detail.SupervisedByStaff  = GetFilterSummary(reportingWorklist.SupervisedByStaffFilter, context);
            }

            return(detail);
        }
		public ListProcedureTypeGroupsResponse ListProcedureTypeGroups(ListProcedureTypeGroupsRequest request)
		{
			Platform.CheckForNullReference(request, "request");
			Platform.CheckMemberIsSet(request.ProcedureTypeGroupClass, "request.ProcedureTypeGroupClass");

			var procedureTypeGroupClass = ProcedureTypeGroup.GetSubClass(request.ProcedureTypeGroupClass, PersistenceContext);
			if (procedureTypeGroupClass == null)
				throw new ArgumentException("Invalid ProcedureTypeGroupClass name");

			var response = new ListProcedureTypeGroupsResponse();

			var assembler = new ProcedureTypeGroupAssembler();
			response.ProcedureTypeGroups =
				CollectionUtils.Map<ProcedureTypeGroup, ProcedureTypeGroupSummary>(
					PersistenceContext.GetBroker<IProcedureTypeGroupBroker>().Find(new ProcedureTypeGroupSearchCriteria(), procedureTypeGroupClass),
					group => assembler.GetProcedureTypeGroupSummary(group, PersistenceContext));

			return response;
		}