public override void Start()
		{
			Platform.GetService<IPatientAdminService>(
				service =>
				{
					var formData = service.LoadPatientProfileEditorFormData(new LoadPatientProfileEditorFormDataRequest());
					if (_isNew)
					{
						_profile = new PatientProfileDetail();
						_profile.Mrn.AssigningAuthority = formData.MrnAssigningAuthorityChoices.Count > 0
							? GetWorkingFacilityInformationAuthority(formData.MrnAssigningAuthorityChoices)
							: null;
						_profile.Healthcard.AssigningAuthority = formData.HealthcardAssigningAuthorityChoices.Count > 0
							? formData.HealthcardAssigningAuthorityChoices[0]
							: null;
						_profile.Sex = formData.SexChoices[0];
						_profile.DateOfBirth = Platform.Time.Date;
					}
					else
					{
						var response = service.LoadPatientProfileForEdit(new LoadPatientProfileForEditRequest(_profileRef));

						_profileRef = response.PatientProfileRef;
						_profile = response.PatientDetail;

						this.Host.Title =
							string.Format(SR.TitlePatientComponent, PersonNameFormat.Format(_profile.Name), MrnFormat.Format(_profile.Mrn));
					}

					if (_newAttachments.Count > 0)
					{
						_profile.Attachments.AddRange(_newAttachments);
						this.Modified = true;
						this.AcceptEnabled = true;
					}

					// if the user has permission to either a) create a new patient, or b) update the patient profile, then 
					// these pages should be displayed
					if (Thread.CurrentPrincipal.IsInRole(
							ClearCanvas.Ris.Application.Common.AuthorityTokens.Workflow.PatientProfile.Update)
						|| Thread.CurrentPrincipal.IsInRole(ClearCanvas.Ris.Application.Common.AuthorityTokens.Workflow.Patient.Create))
					{
						this.Pages.Add(
							new NavigatorPage(
								"Patient",
								_patientEditor =
								new PatientProfileDetailsEditorComponent(
									_isNew,
									formData.MrnAutoGenerated,
									formData.SexChoices,
									formData.MrnAssigningAuthorityChoices,
									formData.HealthcardAssigningAuthorityChoices)));
						this.Pages.Add(
							new NavigatorPage(
								"Patient/Addresses", _addressesSummary = new AddressesSummaryComponent(formData.AddressTypeChoices)));
						this.Pages.Add(
							new NavigatorPage(
								"Patient/Phone Numbers", _phoneNumbersSummary = new PhoneNumbersSummaryComponent(formData.PhoneTypeChoices)));
						this.Pages.Add(
							new NavigatorPage("Patient/Email Addresses", _emailAddressesSummary = new EmailAddressesSummaryComponent()));
						this.Pages.Add(
							new NavigatorPage(
								"Patient/Contact Persons",
								_contactPersonsSummary =
								new ContactPersonsSummaryComponent(formData.ContactPersonTypeChoices, formData.ContactPersonRelationshipChoices)));
						this.Pages.Add(
							new NavigatorPage(
								"Patient/Culture",
								_additionalPatientInfoSummary =
								new PatientProfileAdditionalInfoEditorComponent(formData.ReligionChoices, formData.PrimaryLanguageChoices)));

						_addressesSummary.SetModifiedOnListChange = true;
						_phoneNumbersSummary.SetModifiedOnListChange = true;
						_emailAddressesSummary.SetModifiedOnListChange = true;
						_contactPersonsSummary.SetModifiedOnListChange = true;

						_patientEditor.Subject = _profile;
						_addressesSummary.Subject = _profile.Addresses;
						_phoneNumbersSummary.Subject = _profile.TelephoneNumbers;
						_emailAddressesSummary.Subject = _profile.EmailAddresses;
						_contactPersonsSummary.Subject = _profile.ContactPersons;
						_additionalPatientInfoSummary.Subject = _profile;
					}

					// if the user has permission to either a) create a new patient, or b) update a patient, then
					// these pages should be displayed
					if (Thread.CurrentPrincipal.IsInRole(ClearCanvas.Ris.Application.Common.AuthorityTokens.Workflow.Patient.Create)
						|| Thread.CurrentPrincipal.IsInRole(ClearCanvas.Ris.Application.Common.AuthorityTokens.Workflow.Patient.Update))
					{
						this.Pages.Add(
							new NavigatorPage("Patient/Notes", _notesSummary = new PatientNoteSummaryComponent(_profile.Notes, formData.NoteCategoryChoices)));
						_notesSummary.SetModifiedOnListChange = true;

						var patientDocumentsPage = new NavigatorPage(
							"Patient/Attachments",
							_documentSummary =
							new AttachedDocumentPreviewComponent(false, AttachmentSite.Patient));
						this.Pages.Add(patientDocumentsPage);
						_documentSummary.Attachments = _profile.Attachments;

						if (_newAttachments.Count > 0)
						{
							this.MoveTo(this.Pages.IndexOf(patientDocumentsPage));
							_documentSummary.SetInitialSelection(_newAttachments[0]);
						}
					}

					this.ValidationStrategy = new AllComponentsValidationStrategy();
				});


			base.Start();
		}
		public PatientProfileDetail CreatePatientProfileDetail(PatientProfile profile, 
			IPersistenceContext context, 
			bool includeAddresses,
			bool includeContactPersons,
			bool includeEmailAddresses,
			bool includeTelephoneNumbers,
			bool includeNotes,
			bool includeAttachments,
			bool includeAllergies)
		{
			var healthcardAssembler = new HealthcardAssembler();
			var nameAssembler = new PersonNameAssembler();
			var addressAssembler = new AddressAssembler();
			var telephoneAssembler = new TelephoneNumberAssembler();

			var detail = new PatientProfileDetail
				{
					PatientRef = profile.Patient.GetRef(),
					PatientProfileRef = profile.GetRef(),
					Mrn = new MrnAssembler().CreateMrnDetail(profile.Mrn),
					Healthcard = healthcardAssembler.CreateHealthcardDetail(profile.Healthcard),
					Name = nameAssembler.CreatePersonNameDetail(profile.Name),
					Sex = EnumUtils.GetEnumValueInfo(profile.Sex, context),
					DateOfBirth = profile.DateOfBirth,
					DeathIndicator = profile.DeathIndicator,
					TimeOfDeath = profile.TimeOfDeath,
					PrimaryLanguage = EnumUtils.GetEnumValueInfo(profile.PrimaryLanguage),
					Religion = EnumUtils.GetEnumValueInfo(profile.Religion),
					CurrentHomeAddress = addressAssembler.CreateAddressDetail(profile.CurrentHomeAddress, context),
					CurrentWorkAddress = addressAssembler.CreateAddressDetail(profile.CurrentWorkAddress, context),
					CurrentHomePhone = telephoneAssembler.CreateTelephoneDetail(profile.CurrentHomePhone, context),
					CurrentWorkPhone = telephoneAssembler.CreateTelephoneDetail(profile.CurrentWorkPhone, context),
					BillingInformation = profile.BillingInformation
				};

			if (includeTelephoneNumbers)
			{
				detail.TelephoneNumbers = new List<TelephoneDetail>();
				foreach (var t in profile.TelephoneNumbers)
				{
					detail.TelephoneNumbers.Add(telephoneAssembler.CreateTelephoneDetail(t, context));
				}
			}

			if (includeAddresses)
			{
				detail.Addresses = new List<AddressDetail>();
				foreach (var a in profile.Addresses)
				{
					detail.Addresses.Add(addressAssembler.CreateAddressDetail(a, context));
				}
			}

			if (includeContactPersons)
			{
				var contactPersonAssembler = new ContactPersonAssembler();
				detail.ContactPersons = new List<ContactPersonDetail>();
				foreach (var cp in profile.ContactPersons)
				{
					detail.ContactPersons.Add(contactPersonAssembler.CreateContactPersonDetail(cp));
				}
			}

			if (includeEmailAddresses)
			{
				var emailAssembler = new EmailAddressAssembler();
				detail.EmailAddresses = new List<EmailAddressDetail>();
				foreach (var e in profile.EmailAddresses)
				{
					detail.EmailAddresses.Add(emailAssembler.CreateEmailAddressDetail(e, context));
				}
			}

			if (includeNotes)
			{
				var noteAssembler = new PatientNoteAssembler();
				detail.Notes = new List<PatientNoteDetail>();
				foreach (var n in profile.Patient.Notes)
				{
					detail.Notes.Add(noteAssembler.CreateNoteDetail(n, context));
				}
			}

			if (includeAttachments)
			{
				var attachmentAssembler = new PatientAttachmentAssembler();
				detail.Attachments = new List<AttachmentSummary>();
				foreach (var a in profile.Patient.Attachments)
				{
					
					detail.Attachments.Add(attachmentAssembler.CreatePatientAttachmentSummary(a, context));
				}
			}

			if (includeAllergies)
			{
				var allergyAssembler = new PatientAllergyAssembler();
				detail.Allergies = new List<PatientAllergyDetail>();
				foreach (var a in profile.Patient.Allergies)
				{
					detail.Allergies.Add(allergyAssembler.CreateAllergyDetail(a));
				}
			}

			return detail;
		}
Пример #3
0
		private void UpdateHelper(PatientProfile profile, PatientProfileDetail detail, bool updatePatient, bool updateProfile, bool updateMrn)
		{
			if (updatePatient)
			{
				var patient = profile.Patient;

				var noteAssembler = new PatientNoteAssembler();
				noteAssembler.Synchronize(patient, detail.Notes, CurrentUserStaff, PersistenceContext);

				var attachmentAssembler = new PatientAttachmentAssembler();
				attachmentAssembler.Synchronize(patient.Attachments, detail.Attachments, this.CurrentUserStaff, PersistenceContext);

				var allergyAssembler = new PatientAllergyAssembler();
				allergyAssembler.Synchronize(patient.Allergies, detail.Allergies, PersistenceContext);
			}

			if (updateProfile)
			{
				var assembler = new PatientProfileAssembler();
				assembler.UpdatePatientProfile(profile, detail, updateMrn, PersistenceContext);
			}
		}
		public void UpdatePatientProfile(PatientProfile profile, PatientProfileDetail detail, bool updateMrn, IPersistenceContext context)
		{
			if(updateMrn)
			{
				profile.Mrn.Id = detail.Mrn.Id;
				profile.Mrn.AssigningAuthority = EnumUtils.GetEnumValue<InformationAuthorityEnum>(detail.Mrn.AssigningAuthority, context);
			}

			profile.Healthcard = new HealthcardNumber();
			new HealthcardAssembler().UpdateHealthcard(profile.Healthcard, detail.Healthcard, context);

			var nameAssembler = new PersonNameAssembler();
			nameAssembler.UpdatePersonName(detail.Name, profile.Name);

			profile.Sex = EnumUtils.GetEnumValue<Sex>(detail.Sex);
			profile.DateOfBirth = detail.DateOfBirth;
			profile.DeathIndicator = detail.DeathIndicator;
			profile.TimeOfDeath = detail.TimeOfDeath;

			profile.PrimaryLanguage = EnumUtils.GetEnumValue<SpokenLanguageEnum>(detail.PrimaryLanguage, context);
			profile.Religion = EnumUtils.GetEnumValue<ReligionEnum>(detail.Religion, context);
			profile.BillingInformation = detail.BillingInformation;

			var telephoneAssembler = new TelephoneNumberAssembler();
			profile.TelephoneNumbers.Clear();
			if (detail.TelephoneNumbers != null)
			{
				foreach (var phoneDetail in detail.TelephoneNumbers)
				{
					profile.TelephoneNumbers.Add(telephoneAssembler.CreateTelephoneNumber(phoneDetail));
				}
			}

			var addressAssembler = new AddressAssembler();
			profile.Addresses.Clear();
			if (detail.Addresses != null)
			{
				foreach (var addressDetail in detail.Addresses)
				{
					profile.Addresses.Add(addressAssembler.CreateAddress(addressDetail));
				}
			}

			var emailAssembler = new EmailAddressAssembler();
			profile.EmailAddresses.Clear();
			foreach (var e in detail.EmailAddresses)
			{
				profile.EmailAddresses.Add(emailAssembler.CreateEmailAddress(e));
			}

			var contactAssembler = new ContactPersonAssembler();
			profile.ContactPersons.Clear();
			foreach (var cp in detail.ContactPersons)
			{
				profile.ContactPersons.Add(contactAssembler.CreateContactPerson(cp, context));
			}

		}