protected ExternalPractitioner AddPractitioner(string practitionerId, string givenName, string familyName) { var practitioner = GetPractitioner(practitionerId); if (practitioner != null) { return(practitioner); } if (practitionerId == null || givenName == null || familyName == null) { throw new Exception("Practitioner is not valid"); } var addedPractitioner = new ExternalPractitioner { LicenseNumber = practitionerId, Name = { FamilyName = familyName, GivenName = givenName } }; addedPractitioner.ExtendedProperties.Add("Comment", "HL7"); var contactPoint = new ExternalPractitionerContactPoint(addedPractitioner) { IsDefaultContactPoint = true, Name = "Default", Description = "HL7" }; PersistenceContext.Lock(addedPractitioner, DirtyState.New); PersistenceContext.Lock(contactPoint, DirtyState.New); return(addedPractitioner); }
/// <summary> /// Add an address to a contact point with the specified city and province. /// </summary> public static Address AddAddress(ExternalPractitionerContactPoint cp, string city, string province) { var address = new Address {City = city, Province = province}; cp.Addresses.Add(address); return address; }
private long EstimateAffectedRecords(ExternalPractitionerContactPoint right, ExternalPractitionerContactPoint left) { var rightOrderCount = QueryOrders <long>(new[] { right }, PersistenceContext.GetBroker <IOrderBroker>().CountByResultRecipient); var leftOrderCount = QueryOrders <long>(new[] { left }, PersistenceContext.GetBroker <IOrderBroker>().CountByResultRecipient); // number of contact point referneces that must be updated return(rightOrderCount + leftOrderCount); }
/// <summary> /// Constructor. /// </summary> /// <param name="report"></param> /// <param name="recipient"></param> public ReportPageModel(Report report, ExternalPractitionerContactPoint recipient) : base(new PrintTemplateSettings().ReportTemplateUrl) { Platform.CheckForNullReference(report, "report"); Platform.CheckForNullReference(recipient, "recipient"); _report = report; _recipient = recipient; }
/// <summary> /// Add an address to a contact point with the specified city and province. /// </summary> public static Address AddAddress(ExternalPractitionerContactPoint cp, string city, string province) { var address = new Address { City = city, Province = province }; cp.Addresses.Add(address); return(address); }
/// <summary> /// Add a telephone number to a contact point with the specified area code and number. /// </summary> public static TelephoneNumber AddTelephoneNumber(ExternalPractitionerContactPoint cp, string areaCode, string number) { var telephone = new TelephoneNumber { AreaCode = areaCode, Number = number }; cp.TelephoneNumbers.Add(telephone); return(telephone); }
/// <summary> /// Add an email address to a contact point. /// </summary> public static EmailAddress AddEmailAddress(ExternalPractitionerContactPoint cp, string address) { var email = new EmailAddress { Address = address }; cp.EmailAddresses.Add(email); return(email); }
/// <summary> /// Add a contact point to a practitioner with the specified name and description. /// </summary> /// <remarks> /// No telephone/address/emails are added to the new contact point /// </remarks> public static ExternalPractitionerContactPoint AddContactPoint(ExternalPractitioner p, string name, string description) { var isDefault = p.ContactPoints.Count == 0; var cp = new ExternalPractitionerContactPoint(p, name, description, ResultCommunicationMode.ANY, null, isDefault, new List<TelephoneNumber>(), new List<Address>(), new List<EmailAddress>(), null); p.ContactPoints.Add(cp); return cp; }
/// <summary> /// Add a contact point to a practitioner with the specified name and description. /// </summary> /// <remarks> /// No telephone/address/emails are added to the new contact point /// </remarks> public static ExternalPractitionerContactPoint AddContactPoint(ExternalPractitioner p, string name, string description) { var isDefault = p.ContactPoints.Count == 0; var cp = new ExternalPractitionerContactPoint(p, name, description, ResultCommunicationMode.ANY, null, isDefault, new List <TelephoneNumber>(), new List <Address>(), new List <EmailAddress>(), null); p.ContactPoints.Add(cp); return(cp); }
public void UpdateExternalPractitioner(ExternalPractitionerDetail detail, ExternalPractitioner prac, IPersistenceContext context) { // validate that only one contact point is specified as default var defaultPoints = CollectionUtils.Select(detail.ContactPoints, cp => cp.IsDefaultContactPoint); if (defaultPoints.Count > 1) { throw new RequestValidationException(SR.ExceptionOneDefaultContactPoint); } var assembler = new PersonNameAssembler(); assembler.UpdatePersonName(detail.Name, prac.Name); prac.LicenseNumber = detail.LicenseNumber; prac.BillingNumber = detail.BillingNumber; prac.MarkDeactivated(detail.Deactivated); // update contact points collection var syncHelper = new CollectionSynchronizeHelper <ExternalPractitionerContactPoint, ExternalPractitionerContactPointDetail>( delegate(ExternalPractitionerContactPoint cp, ExternalPractitionerContactPointDetail cpDetail) { // ignore version in this comparison - deal with this issue in the update delegate return(cp.GetRef().Equals(cpDetail.ContactPointRef, true)); }, delegate(ExternalPractitionerContactPointDetail cpDetail, ICollection <ExternalPractitionerContactPoint> cps) { // create a new contact point var cp = new ExternalPractitionerContactPoint(prac); UpdateExternalPractitionerContactPoint(cpDetail, cp, context); cps.Add(cp); }, (cp, cpDetail, cps) => UpdateExternalPractitionerContactPoint(cpDetail, cp, context), (cp, cps) => cps.Remove(cp)); syncHelper.Synchronize(prac.ContactPoints, detail.ContactPoints); ExtendedPropertyUtils.Update(prac.ExtendedProperties, detail.ExtendedProperties); }
/// <summary> /// Performs a simple merge of two contact points. /// </summary> /// <remarks> /// Destination is the primary contact point. The result will have all info inherit from destination. /// The Merge operation should clone/copy all the value collections. /// </remarks> public static ExternalPractitionerContactPoint SimpleMerge(ExternalPractitionerContactPoint src, ExternalPractitionerContactPoint dest) { return(ExternalPractitionerContactPoint.MergeContactPoints(src, dest, dest.Name, dest.Description, dest.PreferredResultCommunicationMode, dest.InformationAuthority, null, null, null)); }
internal PractitionerFacade(ExternalPractitioner practitioner, ExternalPractitionerContactPoint contactPoint) { _practitioner = practitioner; _contactPoint = contactPoint; }
public void UpdateExternalPractitionerContactPoint(ExternalPractitionerContactPointDetail detail, ExternalPractitionerContactPoint contactPoint, IPersistenceContext context) { contactPoint.Name = detail.Name; contactPoint.Description = detail.Description; contactPoint.IsDefaultContactPoint = detail.IsDefaultContactPoint; contactPoint.PreferredResultCommunicationMode = EnumUtils.GetEnumValue<ResultCommunicationMode>(detail.PreferredResultCommunicationMode); contactPoint.InformationAuthority = EnumUtils.GetEnumValue<InformationAuthorityEnum>(detail.InformationAuthority, context); contactPoint.MarkDeactivated(detail.Deactivated); var phoneAssembler = new TelephoneNumberAssembler(); var addressAssembler = new AddressAssembler(); var emailAddressAssembler = new EmailAddressAssembler(); contactPoint.TelephoneNumbers.Clear(); if (detail.TelephoneNumbers != null) { foreach (var phoneDetail in detail.TelephoneNumbers) { contactPoint.TelephoneNumbers.Add(phoneAssembler.CreateTelephoneNumber(phoneDetail)); } } contactPoint.Addresses.Clear(); if (detail.Addresses != null) { foreach (var addressDetail in detail.Addresses) { contactPoint.Addresses.Add(addressAssembler.CreateAddress(addressDetail)); } } contactPoint.EmailAddresses.Clear(); if (detail.EmailAddresses != null) { foreach (var emailAddressDetail in detail.EmailAddresses) { contactPoint.EmailAddresses.Add(emailAddressAssembler.CreateEmailAddress(emailAddressDetail)); } } }
public ExternalPractitionerContactPointSummary CreateExternalPractitionerContactPointSummary(ExternalPractitionerContactPoint contactPoint) { return new ExternalPractitionerContactPointSummary(contactPoint.GetRef(), contactPoint.Name, contactPoint.Description, contactPoint.IsDefaultContactPoint, contactPoint.IsMerged, contactPoint.Deactivated); }
/// <summary> /// Performs a simple merge of two contact points. /// </summary> /// <remarks> /// Destination is the primary contact point. The result will have all info inherit from destination. /// The Merge operation should clone/copy all the value collections. /// </remarks> public static ExternalPractitionerContactPoint SimpleMerge(ExternalPractitionerContactPoint src, ExternalPractitionerContactPoint dest) { return ExternalPractitionerContactPoint.MergeContactPoints(src, dest, dest.Name, dest.Description, dest.PreferredResultCommunicationMode, dest.InformationAuthority, null, null, null); }
/// <summary> /// Add an email address to a contact point. /// </summary> public static EmailAddress AddEmailAddress(ExternalPractitionerContactPoint cp, string address) { var email = new EmailAddress { Address = address }; cp.EmailAddresses.Add(email); return email; }
/// <summary> /// Import external practitioner from CSV format. /// </summary> /// <param name="rows"> /// Each string in the list must contain 25 CSV fields, as follows: /// 0 - FamilyName /// 1 - GivenName /// 2 - MiddleName /// 3 - Prefix /// 4 - Suffix /// 5 - Degree /// 6 - LicenseNumber /// 7 - BillingNumber /// 8 - Street /// 9 - Unit /// 10 - City /// 11 - Province /// 12 - PostalCode /// 13 - Country /// 14 - ValidFrom /// 15 - ValidUntil /// 16 - Phone CountryCode /// 17 - Phone AreaCode /// 18 - Phone Number /// 19 - Phone Extension /// 20 - ValidFrom /// 21 - ValidUntil /// 22 - Fax CountryCode /// 23 - Fax AreaCode /// 24 - Fax Number /// 25 - Fax Extension /// 26 - ValidFrom /// 27 - ValidUntil /// </param> /// <param name="context"></param> public override void Import(List <string> rows, IUpdateContext context) { _context = context; var importedEPs = new List <ExternalPractitioner>(); var validator = new DomainObjectValidator(); foreach (var row in rows) { var fields = ParseCsv(row, _numFields); var epFamilyName = fields[0]; var epGivenName = fields[1]; var epMiddlename = fields[2]; var epPrefix = fields[3]; var epSuffix = fields[4]; var epDegree = fields[5]; var epLicense = fields[6]; var epBillingNumber = fields[7]; var addressStreet = fields[8]; var addressUnit = fields[9]; var addressCity = fields[10]; var addressProvince = fields[11]; var addressPostalCode = fields[12]; var addressCountry = fields[13]; var addressValidFrom = ParseDateTime(fields[14]); var addressValidUntil = ParseDateTime(fields[15]); var phoneCountryCode = fields[16]; var phoneAreaCode = fields[17]; var phoneNumber = fields[18]; var phoneExtension = fields[19]; var phoneValidFrom = ParseDateTime(fields[20]); var phoneValidUntil = ParseDateTime(fields[21]); var faxCountryCode = fields[22]; var faxAreaCode = fields[23]; var faxNumber = fields[24]; var faxExtension = fields[25]; var faxValidFrom = ParseDateTime(fields[26]); var faxValidUntil = ParseDateTime(fields[27]); ExternalPractitioner ep = GetExternalPracitioner(epLicense, importedEPs); if (ep != null) { continue; } ep = new ExternalPractitioner { LicenseNumber = epLicense, BillingNumber = epBillingNumber }; ep.Name = new PersonName(epFamilyName, epGivenName, epMiddlename, epPrefix, epSuffix, epDegree); // create a single default contact point var contactPoint = new ExternalPractitionerContactPoint(ep) { Name = "Default", IsDefaultContactPoint = true }; try { var epAddress = new Address( addressStreet, addressUnit, addressCity, addressProvince, addressPostalCode, addressCountry, AddressType.B, new DateTimeRange(addressValidFrom, addressValidUntil)); validator.Validate(epAddress); contactPoint.Addresses.Add(epAddress); } catch (EntityValidationException) { /* invalid address - ignore */ } try { var epTelephone = new TelephoneNumber( phoneCountryCode, phoneAreaCode, phoneNumber, phoneExtension, TelephoneUse.WPN, TelephoneEquipment.PH, new DateTimeRange(phoneValidFrom, phoneValidUntil)); validator.Validate(epTelephone); contactPoint.TelephoneNumbers.Add(epTelephone); } catch (EntityValidationException) { /* invalid phone - ignore */ } try { var epFax = new TelephoneNumber( faxCountryCode, faxAreaCode, faxNumber, faxExtension, TelephoneUse.WPN, TelephoneEquipment.FX, new DateTimeRange(faxValidFrom, faxValidUntil)); validator.Validate(epFax); contactPoint.TelephoneNumbers.Add(epFax); } catch (EntityValidationException) { /* invalid fax - ignore */ } _context.Lock(ep, DirtyState.New); importedEPs.Add(ep); } }
public void UpdateExternalPractitionerContactPoint(ExternalPractitionerContactPointDetail detail, ExternalPractitionerContactPoint contactPoint, IPersistenceContext context) { contactPoint.Name = detail.Name; contactPoint.Description = detail.Description; contactPoint.IsDefaultContactPoint = detail.IsDefaultContactPoint; contactPoint.PreferredResultCommunicationMode = EnumUtils.GetEnumValue <ResultCommunicationMode>(detail.PreferredResultCommunicationMode); contactPoint.InformationAuthority = EnumUtils.GetEnumValue <InformationAuthorityEnum>(detail.InformationAuthority, context); contactPoint.MarkDeactivated(detail.Deactivated); var phoneAssembler = new TelephoneNumberAssembler(); var addressAssembler = new AddressAssembler(); var emailAddressAssembler = new EmailAddressAssembler(); contactPoint.TelephoneNumbers.Clear(); if (detail.TelephoneNumbers != null) { foreach (var phoneDetail in detail.TelephoneNumbers) { contactPoint.TelephoneNumbers.Add(phoneAssembler.CreateTelephoneNumber(phoneDetail)); } } contactPoint.Addresses.Clear(); if (detail.Addresses != null) { foreach (var addressDetail in detail.Addresses) { contactPoint.Addresses.Add(addressAssembler.CreateAddress(addressDetail)); } } contactPoint.EmailAddresses.Clear(); if (detail.EmailAddresses != null) { foreach (var emailAddressDetail in detail.EmailAddresses) { contactPoint.EmailAddresses.Add(emailAddressAssembler.CreateEmailAddress(emailAddressDetail)); } } }
public ExternalPractitionerContactPointDetail CreateExternalPractitionerContactPointDetail(ExternalPractitionerContactPoint contactPoint, IPersistenceContext context) { var telephoneNumberAssembler = new TelephoneNumberAssembler(); var addressAssembler = new AddressAssembler(); var emailAddressAssembler = new EmailAddressAssembler(); var currentPhone = contactPoint.CurrentPhoneNumber; var currentFax = contactPoint.CurrentFaxNumber; var currentAddress = contactPoint.CurrentAddress; var currentEmailAddress = contactPoint.CurrentEmailAddress; return(new ExternalPractitionerContactPointDetail( contactPoint.GetRef(), contactPoint.Name, contactPoint.Description, contactPoint.IsDefaultContactPoint, EnumUtils.GetEnumValueInfo(contactPoint.PreferredResultCommunicationMode, context), EnumUtils.GetEnumValueInfo(contactPoint.InformationAuthority), CollectionUtils.Map(contactPoint.TelephoneNumbers, (TelephoneNumber phone) => telephoneNumberAssembler.CreateTelephoneDetail(phone, context)), CollectionUtils.Map(contactPoint.Addresses, (Address address) => addressAssembler.CreateAddressDetail(address, context)), CollectionUtils.Map(contactPoint.EmailAddresses, (EmailAddress emailAddress) => emailAddressAssembler.CreateEmailAddressDetail(emailAddress, context)), currentPhone == null ? null : telephoneNumberAssembler.CreateTelephoneDetail(currentPhone, context), currentFax == null ? null : telephoneNumberAssembler.CreateTelephoneDetail(currentFax, context), currentAddress == null ? null : addressAssembler.CreateAddressDetail(currentAddress, context), currentEmailAddress == null ? null : emailAddressAssembler.CreateEmailAddressDetail(currentEmailAddress, context), CreateExternalPractitionerContactPointSummary(contactPoint.GetUltimateMergeDestination()), contactPoint.IsMerged, contactPoint.Deactivated)); }
public ExternalPractitionerContactPointSummary CreateExternalPractitionerContactPointSummary(ExternalPractitionerContactPoint contactPoint) { return(new ExternalPractitionerContactPointSummary(contactPoint.GetRef(), contactPoint.Name, contactPoint.Description, contactPoint.IsDefaultContactPoint, contactPoint.IsMerged, contactPoint.Deactivated)); }
/// <summary> /// Import external practitioner from CSV format. /// </summary> /// <param name="rows"> /// Each string in the list must contain 25 CSV fields, as follows: /// 0 - FamilyName /// 1 - GivenName /// 2 - MiddleName /// 3 - Prefix /// 4 - Suffix /// 5 - Degree /// 6 - LicenseNumber /// 7 - BillingNumber /// 8 - Street /// 9 - Unit /// 10 - City /// 11 - Province /// 12 - PostalCode /// 13 - Country /// 14 - ValidFrom /// 15 - ValidUntil /// 16 - Phone CountryCode /// 17 - Phone AreaCode /// 18 - Phone Number /// 19 - Phone Extension /// 20 - ValidFrom /// 21 - ValidUntil /// 22 - Fax CountryCode /// 23 - Fax AreaCode /// 24 - Fax Number /// 25 - Fax Extension /// 26 - ValidFrom /// 27 - ValidUntil /// </param> /// <param name="context"></param> public override void Import(List<string> rows, IUpdateContext context) { _context = context; var importedEPs = new List<ExternalPractitioner>(); var validator = new DomainObjectValidator(); foreach (var row in rows) { var fields = ParseCsv(row, _numFields); var epFamilyName = fields[0]; var epGivenName = fields[1]; var epMiddlename = fields[2]; var epPrefix = fields[3]; var epSuffix = fields[4]; var epDegree = fields[5]; var epLicense = fields[6]; var epBillingNumber = fields[7]; var addressStreet = fields[8]; var addressUnit = fields[9]; var addressCity = fields[10]; var addressProvince = fields[11]; var addressPostalCode = fields[12]; var addressCountry = fields[13]; var addressValidFrom = ParseDateTime(fields[14]); var addressValidUntil = ParseDateTime(fields[15]); var phoneCountryCode = fields[16]; var phoneAreaCode = fields[17]; var phoneNumber = fields[18]; var phoneExtension = fields[19]; var phoneValidFrom = ParseDateTime(fields[20]); var phoneValidUntil = ParseDateTime(fields[21]); var faxCountryCode = fields[22]; var faxAreaCode = fields[23]; var faxNumber = fields[24]; var faxExtension = fields[25]; var faxValidFrom = ParseDateTime(fields[26]); var faxValidUntil = ParseDateTime(fields[27]); ExternalPractitioner ep = GetExternalPracitioner(epLicense, importedEPs); if (ep != null) continue; ep = new ExternalPractitioner {LicenseNumber = epLicense, BillingNumber = epBillingNumber}; ep.Name = new PersonName(epFamilyName, epGivenName, epMiddlename, epPrefix, epSuffix, epDegree); // create a single default contact point var contactPoint = new ExternalPractitionerContactPoint(ep) {Name = "Default", IsDefaultContactPoint = true}; try { var epAddress = new Address( addressStreet, addressUnit, addressCity, addressProvince, addressPostalCode, addressCountry, AddressType.B, new DateTimeRange(addressValidFrom, addressValidUntil)); validator.Validate(epAddress); contactPoint.Addresses.Add(epAddress); } catch(EntityValidationException) { /* invalid address - ignore */ } try { var epTelephone = new TelephoneNumber( phoneCountryCode, phoneAreaCode, phoneNumber, phoneExtension, TelephoneUse.WPN, TelephoneEquipment.PH, new DateTimeRange(phoneValidFrom, phoneValidUntil)); validator.Validate(epTelephone); contactPoint.TelephoneNumbers.Add(epTelephone); } catch (EntityValidationException) { /* invalid phone - ignore */ } try { var epFax = new TelephoneNumber( faxCountryCode, faxAreaCode, faxNumber, faxExtension, TelephoneUse.WPN, TelephoneEquipment.FX, new DateTimeRange(faxValidFrom, faxValidUntil)); validator.Validate(epFax); contactPoint.TelephoneNumbers.Add(epFax); } catch (EntityValidationException) { /* invalid fax - ignore */ } _context.Lock(ep, DirtyState.New); importedEPs.Add(ep); } }
public MergeDuplicateContactPointResponse MergeDuplicateContactPoint(MergeDuplicateContactPointRequest request) { Platform.CheckForNullReference(request, "request"); Platform.CheckMemberIsSet(request.RetainedContactPointRef, "RetainedContactPointRef"); Platform.CheckMemberIsSet(request.ReplacedContactPointRef, "ReplacedContactPointRef"); var dest = PersistenceContext.Load <ExternalPractitionerContactPoint>(request.RetainedContactPointRef, EntityLoadFlags.Proxy); var src = PersistenceContext.Load <ExternalPractitionerContactPoint>(request.ReplacedContactPointRef, EntityLoadFlags.Proxy); // if we are only doing a cost estimate, exit here without modifying any data if (request.EstimateCostOnly) { // compute cost estimate. Need to include affected records of both src and dest, because both will be merged and deactivated. var cost = EstimateAffectedRecords(dest, src); return(new MergeDuplicateContactPointResponse(cost)); } // combine all phone numbers and addresses, expiring those from the src object var allPhoneNumbers = CollectionUtils.Concat( CloneAndExpire(dest.TelephoneNumbers, tn => tn.ValidRange, false), CloneAndExpire(src.TelephoneNumbers, tn => tn.ValidRange, true)); var allAddresses = CollectionUtils.Concat( CloneAndExpire(dest.Addresses, tn => tn.ValidRange, false), CloneAndExpire(src.Addresses, tn => tn.ValidRange, true)); var allEmailAddresses = CollectionUtils.Concat( CloneAndExpire(dest.EmailAddresses, tn => tn.ValidRange, false), CloneAndExpire(src.EmailAddresses, tn => tn.ValidRange, true)); // merge contact points var result = ExternalPractitionerContactPoint.MergeContactPoints( dest, src, dest.Name, dest.Description, dest.PreferredResultCommunicationMode, dest.InformationAuthority, allPhoneNumbers, allAddresses, allEmailAddresses); PersistenceContext.Lock(result, DirtyState.New); // if user has verify permission, verify the practitioner if (Thread.CurrentPrincipal.IsInRole(AuthorityTokens.Admin.Data.ExternalPractitionerVerification)) { result.Practitioner.MarkVerified(); } // queue work items to migrate orders foreach (var contactPoint in new[] { src, dest }) { var queueItem = MergeWorkQueueItem.Create(contactPoint.GetRef()); PersistenceContext.Lock(queueItem, DirtyState.New); } PersistenceContext.SynchState(); var assembler = new ExternalPractitionerAssembler(); return(new MergeDuplicateContactPointResponse(assembler.CreateExternalPractitionerContactPointSummary(result))); }
public ExternalPractitionerContactPointDetail CreateExternalPractitionerContactPointDetail(ExternalPractitionerContactPoint contactPoint, IPersistenceContext context) { var telephoneNumberAssembler = new TelephoneNumberAssembler(); var addressAssembler = new AddressAssembler(); var emailAddressAssembler = new EmailAddressAssembler(); var currentPhone = contactPoint.CurrentPhoneNumber; var currentFax = contactPoint.CurrentFaxNumber; var currentAddress = contactPoint.CurrentAddress; var currentEmailAddress = contactPoint.CurrentEmailAddress; return new ExternalPractitionerContactPointDetail( contactPoint.GetRef(), contactPoint.Name, contactPoint.Description, contactPoint.IsDefaultContactPoint, EnumUtils.GetEnumValueInfo(contactPoint.PreferredResultCommunicationMode, context), EnumUtils.GetEnumValueInfo(contactPoint.InformationAuthority), CollectionUtils.Map(contactPoint.TelephoneNumbers, (TelephoneNumber phone) => telephoneNumberAssembler.CreateTelephoneDetail(phone, context)), CollectionUtils.Map(contactPoint.Addresses, (Address address) => addressAssembler.CreateAddressDetail(address, context)), CollectionUtils.Map(contactPoint.EmailAddresses, (EmailAddress emailAddress) => emailAddressAssembler.CreateEmailAddressDetail(emailAddress, context)), currentPhone == null ? null : telephoneNumberAssembler.CreateTelephoneDetail(currentPhone, context), currentFax == null ? null : telephoneNumberAssembler.CreateTelephoneDetail(currentFax, context), currentAddress == null ? null : addressAssembler.CreateAddressDetail(currentAddress, context), currentEmailAddress == null ? null : emailAddressAssembler.CreateEmailAddressDetail(currentEmailAddress, context), CreateExternalPractitionerContactPointSummary(contactPoint.GetUltimateMergeDestination()), contactPoint.IsMerged, contactPoint.Deactivated); }
private static void UpdateExternalPractitionerContactPoint(ExternalPractitionerContactPointData data, ExternalPractitionerContactPoint cp, IUpdateContext context) { cp.Name = data.Name; cp.Description = data.Description; cp.IsDefaultContactPoint = data.IsDefaultContactPoint; cp.PreferredResultCommunicationMode = (ResultCommunicationMode)Enum.Parse(typeof(ResultCommunicationMode), data.PreferredResultCommunicationMode); cp.InformationAuthority = string.IsNullOrEmpty(data.InformationAuthority) ? null : context.GetBroker <IEnumBroker>().Find <InformationAuthorityEnum>(data.InformationAuthority); if (data.TelephoneNumbers != null) { cp.TelephoneNumbers.Clear(); foreach (var phoneDetail in data.TelephoneNumbers) { cp.TelephoneNumbers.Add(phoneDetail.CreateTelephoneNumber()); } } if (data.Addresses != null) { cp.Addresses.Clear(); foreach (var addressDetail in data.Addresses) { cp.Addresses.Add(addressDetail.CreateAddress()); } } if (data.EmailAddresses != null) { cp.EmailAddresses.Clear(); foreach (var addressDetail in data.EmailAddresses) { cp.EmailAddresses.Add(addressDetail.CreateEmailAddress()); } } }
public void UpdateExternalPractitioner(ExternalPractitionerDetail detail, ExternalPractitioner prac, IPersistenceContext context) { // validate that only one contact point is specified as default var defaultPoints = CollectionUtils.Select(detail.ContactPoints, cp => cp.IsDefaultContactPoint); if(defaultPoints.Count > 1) throw new RequestValidationException(SR.ExceptionOneDefaultContactPoint); var assembler = new PersonNameAssembler(); assembler.UpdatePersonName(detail.Name, prac.Name); prac.LicenseNumber = detail.LicenseNumber; prac.BillingNumber = detail.BillingNumber; prac.MarkDeactivated(detail.Deactivated); // update contact points collection var syncHelper = new CollectionSynchronizeHelper<ExternalPractitionerContactPoint, ExternalPractitionerContactPointDetail>( delegate (ExternalPractitionerContactPoint cp, ExternalPractitionerContactPointDetail cpDetail) { // ignore version in this comparison - deal with this issue in the update delegate return cp.GetRef().Equals(cpDetail.ContactPointRef, true); }, delegate (ExternalPractitionerContactPointDetail cpDetail, ICollection<ExternalPractitionerContactPoint> cps) { // create a new contact point var cp = new ExternalPractitionerContactPoint(prac); UpdateExternalPractitionerContactPoint(cpDetail, cp, context); cps.Add(cp); }, (cp, cpDetail, cps) => UpdateExternalPractitionerContactPoint(cpDetail, cp, context), (cp, cps) => cps.Remove(cp)); syncHelper.Synchronize(prac.ContactPoints, detail.ContactPoints); ExtendedPropertyUtils.Update(prac.ExtendedProperties, detail.ExtendedProperties); }
/// <summary> /// Add a telephone number to a contact point with the specified area code and number. /// </summary> public static TelephoneNumber AddTelephoneNumber(ExternalPractitionerContactPoint cp, string areaCode, string number) { var telephone = new TelephoneNumber {AreaCode = areaCode, Number = number}; cp.TelephoneNumbers.Add(telephone); return telephone; }
/// <summary> /// Creates a new practitioner that is the result of merging the two specified practitioners. /// </summary> /// <param name="right"></param> /// <param name="left"></param> /// <param name="name"></param> /// <param name="licenseNumber"></param> /// <param name="billingNumber"></param> /// <param name="extendedProperties"></param> /// <param name="defaultContactPoint"></param> /// <param name="deactivatedContactPoints"></param> /// <param name="contactPointReplacements"></param> /// <returns></returns> public static ExternalPractitioner MergePractitioners( ExternalPractitioner right, ExternalPractitioner left, PersonName name, string licenseNumber, string billingNumber, IDictionary<string, string> extendedProperties, ExternalPractitionerContactPoint defaultContactPoint, ICollection<ExternalPractitionerContactPoint> deactivatedContactPoints, IDictionary<ExternalPractitionerContactPoint, ExternalPractitionerContactPoint> contactPointReplacements) { // sanity check if (Equals(right, left)) throw new WorkflowException("Cannot merge a practitioner with itself."); if (right.Deactivated || left.Deactivated) throw new WorkflowException("Cannot merge a practitioner that is de-activated."); if (right.IsMerged || left.IsMerged) throw new WorkflowException("Cannot merge a practitioner that has already been merged."); if (defaultContactPoint != null && defaultContactPoint.IsMerged) throw new WorkflowException("Cannot assigned a merged contact point as default"); // update properties on result record var result = new ExternalPractitioner { Name = name, LicenseNumber = licenseNumber, BillingNumber = billingNumber }; ExtendedPropertyUtils.Update(result.ExtendedProperties, extendedProperties); // construct the set of retained contact points var retainedContactPoints = new HashedSet<ExternalPractitionerContactPoint>(); retainedContactPoints.AddAll(contactPointReplacements.Values); // some of the replacement contact points are merged. This should not be allowed. if (CollectionUtils.Contains(contactPointReplacements.Values, cp => cp.IsMerged)) throw new WorkflowException("Cannot replace a contact point with another that has already been merged."); // add any existing contact point that was not in the replacement list (because it is implicitly being retained) foreach (var contactPoint in CollectionUtils.Concat(right.ContactPoints, left.ContactPoints)) { // No need to retain a merged contact point. Because its replacement would already be retained. if (!contactPointReplacements.ContainsKey(contactPoint) && !contactPoint.IsMerged) retainedContactPoints.Add(contactPoint); } // for all retained contact points, create a copy attached to the result practitioner, // and mark the original as having been merged into the copy foreach (var original in retainedContactPoints) { var copy = original.CreateCopy(result); result.ContactPoints.Add(copy); copy.IsDefaultContactPoint = original.Equals(defaultContactPoint); copy.MarkDeactivated(original.Deactivated || deactivatedContactPoints.Contains(original)); original.SetMergedInto(copy); } // for all replaced contact points, mark the original as being merged into the // copy of the replacement foreach (var kvp in contactPointReplacements) { kvp.Key.SetMergedInto(kvp.Value.MergedInto); } // mark both left and right as edited and merged foreach (var practitioner in new[] { right, left }) { practitioner.MarkEdited(); practitioner.SetMergedInto(result); } // mark the result as being edited result.MarkEdited(); return result; }