/// <summary> /// Creates a Related Document. /// </summary> /// <returns>RelatedDocument</returns> public static RelatedDocument CreateRelatedDocument(Boolean mandatorySectionsOnly) { // Related Document RelatedDocument relatedDocument = PathologyReportWithStructuredContent.CreateRelatedDocument(); // Examination Result Representation relatedDocument.ExaminationResultRepresentation = BaseCDAModel.CreateExternalData(MediaType.PDF, AttachmentFileNameAndPath, null);; // Document Provenance relatedDocument.DocumentDetails = CreateDocumentProvenance(mandatorySectionsOnly); return(relatedDocument); }
/// <summary> /// Creates and hydrates the 'RelatedInformation' section. /// </summary> /// <param name="mandatorySectionsOnly">Includes on the mandatory items</param> /// <returns>A hydrated 'RelatedInformation' object.</returns> public static IDocumentDetails CreateRelatedDocument(Boolean mandatorySectionsOnly) { var relatedDocument = AdvanceCareInformation.CreateRelatedDocument(); // Examination Result Representation (Document Target) relatedDocument.ExternalData = BaseCDAModel.CreateExternalData(); relatedDocument.ExternalData.ExternalDataMediaType = MediaType.PDF; relatedDocument.ExternalData.Path = AttachmentFileNameAndPath; relatedDocument.ExternalData.Caption = "Attachment"; // Document Provenance relatedDocument.DocumentProvenance = CreateDocumentProvenance(mandatorySectionsOnly); return(relatedDocument); }
/// <summary> /// Creates a Related Document. /// </summary> /// <returns>RelatedDocument</returns> public static RelatedDocument CreateRelatedDocument(Boolean mandatorySectionsOnly) { RelatedDocument relatedDocument = PathologyResultReport.CreateRelatedDocument(); // Pathology PDF var attachmentPdf = BaseCDAModel.CreateExternalData(); attachmentPdf.ExternalDataMediaType = MediaType.PDF; attachmentPdf.Path = AttachmentFileNameAndPath; relatedDocument.ExaminationResultRepresentation = attachmentPdf; // Document Provenance relatedDocument.DocumentDetails = CreateDocumentProvenance(mandatorySectionsOnly); return(relatedDocument); }
/// <summary> /// Creates and hydrates the 'Other Test Result' Attachment section. /// </summary> /// <returns>A hydrated 'OtherTestResult' object.</returns> public static OtherTestResult CreateOtherTestResultAttachment() { var otherTestResult = BaseCDAModel.CreateOtherTestResult(); // Report Name otherTestResult.ReportName = BaseCDAModel.CreateCodableText("Report with Attachment"); // Report Status otherTestResult.ReportStatus = BaseCDAModel.CreateCodableText(Hl7V3ResultStatus.NoOrderOnRecordForThisTest); // Report ExternalData ExternalData report = BaseCDAModel.CreateExternalData(MediaType.PDF, AttachmentFileNameAndPath, "Path File"); otherTestResult.ReportContent = BaseCDAModel.CreateEncapsulatedData(); otherTestResult.ReportContent.ExternalData = report; // Report Date otherTestResult.ReportDate = new ISO8601DateTime(DateTime.Now.AddDays(-2)); return(otherTestResult); }
/// <summary> /// Create the related document from information in the HL7 V2 message. /// </summary> /// <param name="message">The HL7 V2 message.</param> /// <param name="reportAttachment">Report attachment.</param> /// <returns>RelatedDocument</returns> internal static RelatedDocument CreateRelatedDocument(HL7GenericMessage message, ReportAttachment reportAttachment) { RelatedDocument relatedDocument = PathologyResultReport.CreateRelatedDocument(); // Pathology PDF var attachmentPdf = BaseCDAModel.CreateExternalData(); attachmentPdf.ExternalDataMediaType = reportAttachment.MediaType; attachmentPdf.ByteArrayInput = new ByteArrayInput { ByteArray = reportAttachment.Data, FileName = reportAttachment.Filename }; relatedDocument.ExaminationResultRepresentation = attachmentPdf; DocumentDetails documentDetails = BaseCDAModel.CreateDocumentDetails(); // Report Date documentDetails.ReportDate = GetReportDate(message); // Result Status string status = GetRelatedDocumentStatus(message); Hl7V3ResultStatus resultStatus; if (!EnumHelper.TryGetEnumValue <Hl7V3ResultStatus, NameAttribute>(attribute => attribute.Code == status, out resultStatus)) { throw new ArgumentException("No matching Hl7V3ResultStatus value found"); } documentDetails.ReportStatus = BaseCDAModel.CreateResultStatus(resultStatus); // Report Name documentDetails.ReportDescription = GetReportName(message); relatedDocument.DocumentDetails = documentDetails; return(relatedDocument); }
public void Process(Spia.PathologyReportModel.Model.PathologyReport Report, string CdaOutputDirectory, string PdfDirectory, byte[] LogoBytes = null) { var pathologyResultReport = PathologyResultReport.CreatePathologyResultReport(); // Include Logo if (LogoBytes != null) { pathologyResultReport.IncludeLogo = true; pathologyResultReport.LogoByte = LogoBytes; } else { pathologyResultReport.IncludeLogo = false; } // Set Creation Time DateTimeOffset DocumentCreationDateTime = Report.GetOldestReportReleaseDateTime(); pathologyResultReport.DocumentCreationTime = new ISO8601DateTime(DocumentCreationDateTime.DateTime, ISO8601DateTime.Precision.Second, DocumentCreationDateTime.Offset); #region Setup and populate the CDA context model // Setup and populate the CDA context model var cdaContext = PathologyResultReport.CreateCDAContext(); // Document Id cdaContext.DocumentId = BaseCDAModel.CreateIdentifier(BaseCDAModel.CreateOid(), null); // Set Id cdaContext.SetId = BaseCDAModel.CreateIdentifier(BaseCDAModel.CreateGuid(), null); // CDA Context Version , this needs to increment for each correction to the first report instance cdaContext.Version = "1"; // Custodian cdaContext.Custodian = BaseCDAModel.CreateCustodian(); //custodian/assignedCustodian cdaContext.Custodian.Participant = BaseCDAModel.CreateParticipantCustodian();; // custodian/assignedCustodian/representedCustodianOrganization cdaContext.Custodian.Participant.Organisation = BaseCDAModel.CreateOrganisationName(); // custodian/assignedCustodian/representedCustodianOrganization/<Entity Identifier> cdaContext.Custodian.Participant.Organisation.Identifiers = new List <Identifier> { BaseCDAModel.CreateHealthIdentifier(HealthIdentifierType.HPIO, Report.PerformingLaboratory.Hpio.Replace(" ", string.Empty)) }; // custodian/assignedCustodian/representedCustodianOrganization/name cdaContext.Custodian.Participant.Organisation.Name = Report.PerformingLaboratory.FacilityName; ElectronicCommunicationDetail PerformingPathologyLabComms = BaseCDAModel.CreateElectronicCommunicationDetail( Report.PerformingLaboratory.BusinessPhoneNumber, ElectronicCommunicationMedium.Telephone, ElectronicCommunicationUsage.WorkPlace); // custodian/assignedCustodian/representedCustodianOrganization/<Address> cdaContext.Custodian.Participant.Address = GetCdaAddress(Report.PerformingLaboratory.Address); // custodian/assignedCustodian/representedCustodianOrganization/<Electronic Communication Detail> cdaContext.Custodian.Participant.ElectronicCommunicationDetail = PerformingPathologyLabComms; // Legal Authenticator cdaContext.LegalAuthenticator = BaseCDAModel.CreateLegalAuthenticator(); // LegalAuthenticator/assignedEntity cdaContext.LegalAuthenticator.Participant = BaseCDAModel.CreateParticipantForLegalAuthenticator(); // LegalAuthenticator/assignedEntity/assignedPerson cdaContext.LegalAuthenticator.Participant.Person = BaseCDAModel.CreatePerson(); DateTimeOffset OldestReportReleaseDate = Report.GetOldestReportReleaseDateTime(); // LegalAuthenticator/time/@value cdaContext.LegalAuthenticator.Participant.DateTimeAuthenticated = new ISO8601DateTime(OldestReportReleaseDate.DateTime, ISO8601DateTime.Precision.Second, OldestReportReleaseDate.Offset); Spia.PathologyReportModel.Model.Provider FirstReportingPathologist = Report.ReportList.First().ReportingPathologist; //LegalAuthenticator/assignedEntity/assignedPerson/<Person Name> var ReportingPathologistName = BaseCDAModel.CreatePersonName(); if (FirstReportingPathologist.Name.Given is object) { ReportingPathologistName.GivenNames = new List <string> { FirstReportingPathologist.Name.Given }; } ReportingPathologistName.FamilyName = FirstReportingPathologist.Name.Family; if (FirstReportingPathologist.Name.Title is object) { ReportingPathologistName.Titles = new List <string> { FirstReportingPathologist.Name.Title }; } ReportingPathologistName.NameUsages = new List <NameUsage> { NameUsage.Legal }; cdaContext.LegalAuthenticator.Participant.Person.PersonNames = new List <Nehta.VendorLibrary.CDA.IPersonName> { ReportingPathologistName }; // LegalAuthenticator/assignedEntity/<Entity Identifier> cdaContext.LegalAuthenticator.Participant.Person.Identifiers = new List <Identifier> { BaseCDAModel.CreateHealthIdentifier(HealthIdentifierType.HPII, FirstReportingPathologist.IdentifierList.SingleOrDefault(x => x.Type == PathologyReportModel.Model.IdentifierType.HPII).Value.Replace(" ", "")) }; // LegalAuthenticator/assignedEntity/code cdaContext.LegalAuthenticator.Role = BaseCDAModel.CreateRole(Occupation.Pathologist, Nehta.VendorLibrary.CDA.Generator.Enums.CodingSystem.ANZSCORevision1); cdaContext.LegalAuthenticator.Participant.Addresses = new List <IAddress>() { GetCdaAddress(Report.PerformingLaboratory.Address) }; // LegalAuthenticator/assignedEntity/<Electronic Communication Detail> cdaContext.LegalAuthenticator.Participant.ElectronicCommunicationDetails = new List <ElectronicCommunicationDetail> { PerformingPathologyLabComms }; // LegalAuthenticator/assignedEntity/representedOrganization cdaContext.LegalAuthenticator.Participant.Organisation = BaseCDAModel.CreateOrganisationName(); // LegalAuthenticator/assignedEntity/representedOrganization/name cdaContext.LegalAuthenticator.Participant.Organisation.Name = Report.PerformingLaboratory.FacilityName; // LegalAuthenticator/assignedEntity/representedOrganization/<Entity Identifier> cdaContext.LegalAuthenticator.Participant.Organisation.Identifiers = new List <Identifier>(); var CodableConceptNataSiteNumber = BaseCDAModel.CreateCodableText(); CodableConceptNataSiteNumber.Code = "XX"; CodableConceptNataSiteNumber.CodeSystemName = "Identifier Type (HL7)"; CodableConceptNataSiteNumber.CodeSystemCode = "2.16.840.1.113883.12.203"; CodableConceptNataSiteNumber.DisplayName = "Organization identifier"; var NataSiteNumber = BaseCDAModel.CreateIdentifier("1.2.36.1.2001.1005.74", Report.PerformingLaboratory.NataSiteNumber); NataSiteNumber.Code = CodableConceptNataSiteNumber; NataSiteNumber.AssigningGeographicArea = "National Identifier"; NataSiteNumber.AssigningAuthorityName = "NATA Site Number"; cdaContext.LegalAuthenticator.Participant.Organisation.Identifiers.Add(NataSiteNumber); //cdaContext.LegalAuthenticator.Participant.Organisation.Identifiers.Add(BaseCDAModel.CreateIdentifier("NATA", Nehta.VendorLibrary.CDA.Generator.Enums.HealthcareIdentifierGeographicArea.NationalIdentifier, PerformingPathologyLab.NataSiteNumber, "1.2.36.1.2001.1005.12", BaseCDAModel.CreateCodableText("AUSNATA", Nehta.VendorLibrary.CDA.Generator.Enums.CodingSystem.HL7IdentifierType, "National Association of Testing Authorities (NATA) Site Number"))); cdaContext.LegalAuthenticator.Participant.Organisation.Identifiers.Add(BaseCDAModel.CreateHealthIdentifier(HealthIdentifierType.HPIO, Report.PerformingLaboratory.Hpio.Replace(" ", ""))); pathologyResultReport.CDAContext = cdaContext; #endregion #region Setup and Populate the SCS Context model pathologyResultReport.SCSContext = PathologyResultReport.CreateSCSContext(); // Author Health Care Provider pathologyResultReport.SCSContext.Author = BaseCDAModel.CreateAuthorHealthcareProvider(); // Document Author > Participant pathologyResultReport.SCSContext.Author.Participant = BaseCDAModel.CreateParticipantForAuthorHealthcareProvider(); pathologyResultReport.SCSContext.Author.AuthorParticipationPeriodOrDateTimeAuthored = BaseCDAModel.CreateParticipationPeriod(new ISO8601DateTime(OldestReportReleaseDate.DateTime, ISO8601DateTime.Precision.Second, OldestReportReleaseDate.Offset)); // Document Author > Role = AddressPurpose.Residential pathologyResultReport.SCSContext.Author.Role = BaseCDAModel.CreateRole(Occupation.Pathologist, Nehta.VendorLibrary.CDA.Generator.Enums.CodingSystem.ANZSCORevision1); // Document Author > Participant > Person or Organisation or Device > Person > Person Name (Note: 1..* in ACI) pathologyResultReport.SCSContext.Author.Participant.Person = BaseCDAModel.CreatePersonHealthcareProvider(); pathologyResultReport.SCSContext.Author.Participant.Person.PersonNames = new List <IPersonName> { ReportingPathologistName }; //person.PersonNames = new List<IPersonName> { ReportingPathologistName }; //if (!mandatoryOnly) //{ // // Not providing a family name will insert a nullflavor of 'NI' // name.FamilyName = "Doctor family name"; //} pathologyResultReport.SCSContext.Author.Participant.Person.Identifiers = cdaContext.LegalAuthenticator.Participant.Person.Identifiers; pathologyResultReport.SCSContext.Author.Participant.Person.Organisation = BaseCDAModel.CreateEmploymentOrganisation(); pathologyResultReport.SCSContext.Author.Participant.Person.Organisation.Name = Report.PerformingLaboratory.FacilityName; pathologyResultReport.SCSContext.Author.Participant.Person.Organisation.Identifiers = new List <Identifier>() { BaseCDAModel.CreateHealthIdentifier(HealthIdentifierType.HPIO, Report.PerformingLaboratory.Hpio.Replace(" ", "")) }; pathologyResultReport.SCSContext.Author.Participant.ElectronicCommunicationDetails = new List <ElectronicCommunicationDetail>() { PerformingPathologyLabComms }; // Document Author > Participant > Addresses pathologyResultReport.SCSContext.Author.Participant.Addresses = new List <IAddress> { GetCdaAddress(Report.PerformingLaboratory.Address) }; // Document Author > Participant > Address (Note: optional in ACI) pathologyResultReport.SCSContext.Author.Participant.Person.Organisation.Addresses = new List <IAddress> { GetCdaAddress(Report.PerformingLaboratory.Address) }; pathologyResultReport.SCSContext.Author.Participant.Person.Organisation.Name = Report.PerformingLaboratory.FacilityName; pathologyResultReport.SCSContext.Author.Participant.Person.Organisation.NameUsage = OrganisationNameUsage.BusinessName; //pathologyResultReport.SCSContext.Author.Participant.Person.Organisation.Department = "Some department service provider"; //pathologyResultReport.SCSContext.Author.Participant.Person.Organisation.EmploymentType = BaseCDAModel.CreateCodableText(null, null, null, "Casual", null); pathologyResultReport.SCSContext.Author.Participant.Person.Organisation.Occupation = BaseCDAModel.CreateRole(Occupation.Pathologist, Nehta.VendorLibrary.CDA.Generator.Enums.CodingSystem.ANZSCORevision1); //pathologyResultReport.SCSContext.Author.Participant.Person.Organisation.PositionInOrganisation = BaseCDAModel.CreateCodableText(null, null, null, "Manager", null); pathologyResultReport.SCSContext.Author.Participant.Person.Organisation.ElectronicCommunicationDetails = new List <ElectronicCommunicationDetail> { PerformingPathologyLabComms }; // The Reporting Pathologist pathologyResultReport.SCSContext.ReportingPathologist = PathologyResultReport.CreateReportingPathologist(); // Document reportingPathologist > Participant pathologyResultReport.SCSContext.ReportingPathologist.Participant = PathologyResultReport.CreateParticipantForReportingPathologist(); pathologyResultReport.SCSContext.ReportingPathologist.Participant.Person = BaseCDAModel.CreatePersonWithOrganisation(); pathologyResultReport.SCSContext.ReportingPathologist.Participant.Person.PersonNames = new List <IPersonName> { ReportingPathologistName }; // Participation Period pathologyResultReport.SCSContext.ReportingPathologist.ParticipationEndTime = new ISO8601DateTime(OldestReportReleaseDate.DateTime, ISO8601DateTime.Precision.Second, OldestReportReleaseDate.Offset); // Document reportingPathologist > Role pathologyResultReport.SCSContext.ReportingPathologist.Role = PathologyResultReport.CreateRole(Occupation.Pathologist); // Document reportingPathologist > Participant > Address pathologyResultReport.SCSContext.ReportingPathologist.Participant.Addresses = new List <IAddress>() { GetCdaAddress(Report.PerformingLaboratory.Address) }; pathologyResultReport.SCSContext.ReportingPathologist.Participant.ElectronicCommunicationDetails = new List <ElectronicCommunicationDetail> { PerformingPathologyLabComms }; pathologyResultReport.SCSContext.ReportingPathologist.Participant.Person = pathologyResultReport.SCSContext.Author.Participant.Person; // Order Details pathologyResultReport.SCSContext.OrderDetails = DiagnosticImagingReport.CreateOrderDetails(); // Requester Order Identifier //pathologyResultReport.SCSContext.OrderDetails.RequesterOrderIdentifier = BaseCDAModel.CreateIdentifier("1.2.36.1.2001.1005.52.8003620833333789", "10523479"); // Requester pathologyResultReport.SCSContext.OrderDetails.Requester = BaseCDAModel.CreateRequester(); pathologyResultReport.SCSContext.OrderDetails.Requester.ParticipationEndTime = new ISO8601DateTime(Report.Request.RequestedDate.DateTime, ISO8601DateTime.Precision.Day, Report.Request.RequestedDate.Offset); // Document Requester> Role pathologyResultReport.SCSContext.OrderDetails.Requester.Role = BaseCDAModel.CreateRole(Occupation.GeneralMedicalPractitioner, Nehta.VendorLibrary.CDA.Generator.Enums.CodingSystem.ANZSCORevision1); pathologyResultReport.SCSContext.OrderDetails.Requester.Participant = BaseCDAModel.CreateParticipantForRequester(); pathologyResultReport.SCSContext.OrderDetails.Requester.Participant.Person = BaseCDAModel.CreatePersonWithOrganisation(); // Participation Period var RequestingDoctorName = BaseCDAModel.CreatePersonName(); RequestingDoctorName.FamilyName = Report.Request.RequestingProvider.Name.Family; if (Report.Request.RequestingProvider.Name.Given is object) { RequestingDoctorName.GivenNames = new List <string>() { Report.Request.RequestingProvider.Name.Given }; } pathologyResultReport.SCSContext.OrderDetails.Requester.Participant.Person.PersonNames = new List <IPersonName>() { RequestingDoctorName }; pathologyResultReport.SCSContext.OrderDetails.Requester.Participant.Person.Identifiers = new List <Identifier>(); ///Get Requester HPI-I var RequesterHpii = Report.Request.RequestingProvider.IdentifierList.SingleOrDefault(x => x.Type == PathologyReportModel.Model.IdentifierType.HPII); if (RequesterHpii is object) { pathologyResultReport.SCSContext.OrderDetails.Requester.Participant.Person.Identifiers.Add(BaseCDAModel.CreateHealthIdentifier(HealthIdentifierType.HPII, RequesterHpii.Value.Replace(" ", ""))); } ///Get Requester Medicare Provider Number var RequesterMedicareProvidernumber = Report.Request.RequestingProvider.IdentifierList.SingleOrDefault(x => x.Type == PathologyReportModel.Model.IdentifierType.MedicareProviderNumber); if (RequesterMedicareProvidernumber is object) { var MedicareProvidernumberIdentifier = BaseCDAModel.CreateIdentifier("Medicare", Nehta.VendorLibrary.CDA.Generator.Enums.HealthcareIdentifierGeographicArea.NationalIdentifier, RequesterMedicareProvidernumber.Value, "1.2.36.174030967.0.2", BaseCDAModel.CreateCodableText("AUSHICPR", Nehta.VendorLibrary.CDA.Generator.Enums.CodingSystem.HL7IdentifierType, "Medicare Provider Number")); pathologyResultReport.SCSContext.OrderDetails.Requester.Participant.Person.Identifiers.Add(MedicareProvidernumberIdentifier); } // Subject Of Care pathologyResultReport.SCSContext.SubjectOfCare = BaseCDAModel.CreateSubjectOfCare(); pathologyResultReport.SCSContext.SubjectOfCare.Participant = BaseCDAModel.CreateParticipantForSubjectOfCare(); pathologyResultReport.SCSContext.SubjectOfCare.Participant.Person = BaseCDAModel.CreatePersonForSubjectOfCare(); pathologyResultReport.SCSContext.SubjectOfCare.Participant.Person.PersonNames = new List <IPersonName>(); pathologyResultReport.SCSContext.SubjectOfCare.Participant.Person.PersonNames.Add(GetCdaPatientName(Report.Patient.Name)); pathologyResultReport.SCSContext.SubjectOfCare.Participant.Person.Gender = GetCdaGender(Report.Patient.Gender); pathologyResultReport.SCSContext.SubjectOfCare.Participant.Person.DateOfBirth = new ISO8601DateTime(Report.Patient.DateOfBirth, ISO8601DateTime.Precision.Day); pathologyResultReport.SCSContext.SubjectOfCare.Participant.Person.IndigenousStatus = IndigenousStatus.NeitherAboriginalNorTorresStraitIslanderOrigin; //Phone numbers if (Report.Patient.HomePhoneNumber is object) { if (pathologyResultReport.SCSContext.SubjectOfCare.Participant.ElectronicCommunicationDetails is null) { pathologyResultReport.SCSContext.SubjectOfCare.Participant.ElectronicCommunicationDetails = new List <ElectronicCommunicationDetail>(); } //Work out if it is a Mobile number ElectronicCommunicationMedium ElectronicCommunicationMedium = ElectronicCommunicationMedium.Telephone; if (Report.Patient.HomePhoneNumber.Replace(" ", "").StartsWith("04", StringComparison.CurrentCultureIgnoreCase) || Report.Patient.HomePhoneNumber.Replace(" ", "").StartsWith("+614", StringComparison.CurrentCultureIgnoreCase)) { ElectronicCommunicationMedium = ElectronicCommunicationMedium.Mobile; } pathologyResultReport.SCSContext.SubjectOfCare.Participant.ElectronicCommunicationDetails.Add( BaseCDAModel.CreateElectronicCommunicationDetail( Report.Patient.HomePhoneNumber, ElectronicCommunicationMedium, ElectronicCommunicationUsage.Home) ); } //Address pathologyResultReport.SCSContext.SubjectOfCare.Participant.Addresses = new List <IAddress>(); foreach (var Address in Report.Patient.AddressList) { pathologyResultReport.SCSContext.SubjectOfCare.Participant.Addresses.Add(GetCdaAddress(Address)); } pathologyResultReport.SCSContext.SubjectOfCare.Participant.Person.Identifiers = new List <Identifier>(); var IhiNumber = Report.Patient.IdentifierList.SingleOrDefault(x => x.Type == PathologyReportModel.Model.IdentifierType.IHI); if (IhiNumber is object) { pathologyResultReport.SCSContext.SubjectOfCare.Participant.Person.Identifiers.Add(BaseCDAModel.CreateHealthIdentifier(HealthIdentifierType.IHI, IhiNumber.Value.Replace(" ", ""))); } var MedicareNumber = Report.Patient.IdentifierList.SingleOrDefault(x => x.Type == PathologyReportModel.Model.IdentifierType.MedicareNumber); if (MedicareNumber is object) { //Medicare Number goes in Entitlements as it is not a true identifier legally var MedicareEntitlement = BaseCDAModel.CreateEntitlement(); MedicareEntitlement.Id = BaseCDAModel.CreateMedicareNumber(MedicareNumberType.MedicareCardNumber, MedicareNumber.Value.Replace(" ", "")); MedicareEntitlement.Type = EntitlementType.MedicareBenefits; //MedicareEntitlement.ValidityDuration = BaseCDAModel.CreateInterval(new ISO8601DateTime(DateTime.Now), new ISO8601DateTime(DateTime.Now)); pathologyResultReport.SCSContext.SubjectOfCare.Participant.Entitlements = new List <Entitlement> { MedicareEntitlement }; } //var MrnNumber = this.Input.Message.Segment("PID").Element(3).RepeatList.SingleOrDefault(x => x.Component(5).AsString.Equals("MR", StringComparison.CurrentCultureIgnoreCase)); //if (MrnNumber is object) //{ // pathologyResultReport.SCSContext.SubjectOfCare.Participant.Person.Identifiers.Add(BaseCDAModel.CreateMedicalRecordNumber(MrnNumber.Component(1).AsString, "We need a root OID for the MRN Facility", MrnNumber.Component(4).AsString)); //} #endregion #region Setup and populate the SCS Content model // Setup and populate the SCS Content model pathologyResultReport.SCSContent = PathologyResultReport.CreateSCSContent(); // Pathology Test Result string ReportLinkName = string.Empty; pathologyResultReport.SCSContent.PathologyTestResult = new List <Nehta.VendorLibrary.CDA.SCSModel.Pathology.PathologyTestResult>(); foreach (var Panel in Report.ReportList) { var TestResult = PathologyResultReport.CreatePathologyTestResult(); pathologyResultReport.SCSContent.PathologyTestResult.Add(TestResult); // Please note optional field - Note: This field is only displayed in the Narrative TestResult.ReportingPathologistForTestResult = Report.ReportList.First().ReportingPathologist.Name.Title ?? ""; TestResult.ReportingPathologistForTestResult = $"{TestResult.ReportingPathologistForTestResult} {Report.ReportList.First().ReportingPathologist.Name.Family.ToUpper()}"; TestResult.ReportingPathologistForTestResult = $"{TestResult.ReportingPathologistForTestResult}, {Report.ReportList.First().ReportingPathologist.Name.Given ?? ""}"; if (!string.IsNullOrWhiteSpace(Panel.ReportType.Local.Oid)) { TestResult.TestResultName = BaseCDAModel.CreateCodableText(); TestResult.TestResultName.Code = Panel.ReportType.Local.Term; TestResult.TestResultName.DisplayName = Panel.ReportType.Local.Description; TestResult.TestResultName.CodeSystemCode = Panel.ReportType.Local.Oid; TestResult.TestResultName.OriginalText = Panel.ReportType.Local.Description; } else { TestResult.TestResultName = BaseCDAModel.CreateCodableText(); TestResult.TestResultName.OriginalText = Panel.ReportType.Local.Description; } if (Panel.ReportType.Snomed is object) { TestResult.TestResultName.Translations = new List <ICodableTranslation>(); TestResult.TestResultName.Translations.Add(BaseCDAModel.CreateCodableTranslation(Panel.ReportType.Snomed.Term, Nehta.VendorLibrary.CDA.Generator.Enums.CodingSystem.SNOMED, Panel.ReportType.Snomed.Description)); } // Department Code TestResult.PathologyDiscipline = GetCdaDiagnosticService(Panel.Department); // ResultStatus TestResult.OverallTestResultStatus = GetCdaResultStatus(Panel.ReportStatus); // Test Specimen Detail TestResult.TestSpecimenDetail = PathologyResultReport.CreateTestSpecimenDetail(); TestResult.TestSpecimenDetail.CollectionDateTime = new ISO8601DateTime(Panel.CollectionDateTime.DateTime, ISO8601DateTime.Precision.Minute, Panel.CollectionDateTime.Offset); TestResult.ObservationDateTime = TestResult.TestSpecimenDetail.CollectionDateTime; } // Related Document pathologyResultReport.SCSContent.RelatedDocument = PathologyResultReport.CreateRelatedDocument(); System.IO.FileInfo PdfFileInfo = new System.IO.FileInfo(System.IO.Path.Combine(PdfDirectory, Report.PdfFileName)); if (!PdfFileInfo.Exists) { throw new FieldAccessException($"Unable to locate PDF attachment file at path: {PdfFileInfo.FullName}"); } if (!PdfFileInfo.Extension.EndsWith(".pdf", StringComparison.CurrentCultureIgnoreCase)) { throw new FieldAccessException($"The report attachment file must be in a .pdf format."); } // Pathology PDF var AttachmentPdf = BaseCDAModel.CreateExternalData(); AttachmentPdf.ExternalDataMediaType = Nehta.VendorLibrary.CDA.Generator.Enums.MediaType.PDF; //We have to move the PDF attachment file to a new place and then rename it to 'attachment.pdf' and then after //generating the CDA document we will delete at copy of the PDF. System.IO.FileInfo TempAttachmentFilePath = new System.IO.FileInfo(System.IO.Path.Combine(TempWorkingDirectoryPath.FullName, "attachment.pdf")); if (TempAttachmentFilePath.Exists) { TempAttachmentFilePath.Delete(); } PdfFileInfo.CopyTo(TempAttachmentFilePath.FullName); AttachmentPdf.Path = TempAttachmentFilePath.FullName; pathologyResultReport.SCSContent.RelatedDocument.ExaminationResultRepresentation = AttachmentPdf; // Document Provenance pathologyResultReport.SCSContent.RelatedDocument.DocumentDetails = BaseCDAModel.CreateDocumentDetails(); // Report Identifier pathologyResultReport.SCSContent.RelatedDocument.DocumentDetails.ReportIdentifier = BaseCDAModel.CreateIdentifier($"1.2.36.1.2001.1005.54.{Report.PerformingLaboratory.Hpio.Replace(" ", "")}", Report.ReportList.First().ReportId); // Report Date pathologyResultReport.SCSContent.RelatedDocument.DocumentDetails.ReportDate = new ISO8601DateTime(Report.GetOldestReportReleaseDateTime().DateTime, ISO8601DateTime.Precision.Second, Report.GetOldestReportReleaseDateTime().Offset); // Result Status pathologyResultReport.SCSContent.RelatedDocument.DocumentDetails.ReportStatus = GetCdaResultStatus(Report.GetRolledUpReportStatus()); // Report Name if (Report.ReportList.Count == 1) { pathologyResultReport.SCSContent.RelatedDocument.DocumentDetails.ReportDescription = Report.ReportList[0].ReportType.Local.Description; } else { pathologyResultReport.SCSContent.RelatedDocument.DocumentDetails.ReportDescription = "Pathology Report"; } #endregion XmlDocument xmlDoc; try { Nehta.VendorLibrary.CDA.Generator.CDAGenerator.NarrativeGenerator = new Nehta.VendorLibrary.CDA.Generator.CDANarrativeGenerator(); //Pass the Event Summary model into the GeneratePathologyResultReport method xmlDoc = Nehta.VendorLibrary.CDA.Generator.CDAGenerator.GeneratePathologyResultReport(pathologyResultReport); System.IO.DirectoryInfo CdaOutputDirectoryInfo = new System.IO.DirectoryInfo(CdaOutputDirectory); System.IO.FileInfo CdaFileInfo = new System.IO.FileInfo(System.IO.Path.Combine(CdaOutputDirectoryInfo.FullName, Report.PdfFileName.Replace(".pdf", ".xml"))); if (System.IO.File.Exists(CdaFileInfo.FullName)) { System.IO.File.Delete(CdaFileInfo.FullName); } using (var writer = XmlWriter.Create(CdaFileInfo.FullName, new XmlWriterSettings { Indent = true })) { xmlDoc.Save(writer); } } catch (Nehta.VendorLibrary.Common.ValidationException ex) { //Catch any validation exceptions var validationMessages = ex.GetMessagesString(); throw new ApplicationException($"Error encountered in generating CDA document: {validationMessages}"); } finally { TempAttachmentFilePath.Delete(); } }
/// <summary> /// Creates and hydrates the 'SpecimenDetail' section. /// </summary> /// <returns>A hydrated 'SpecimenDetail' object.</returns> public static SpecimenDetail CreateTestSpecimenDetail(Boolean mandatorySectionsOnly) { // Test Specimen Detail (SPECIMEN) SpecimenDetail specimenDetailOne = BaseCDAModel.CreateSpecimenDetail(); // Date and Time of Collection (Collection DateTime) specimenDetailOne.CollectionDateTime = new ISO8601DateTime(DateTimeNow); if (!mandatorySectionsOnly) { // Specimen Tissue Type specimenDetailOne.SpecimenTissueType = BaseCDAModel.CreateCodableText("85756007", CodingSystem.SNOMED, "Body tissue structure"); // Collection Procedure specimenDetailOne.CollectionProcedure = BaseCDAModel.CreateCodableText("82078001", CodingSystem.SNOMED, "Collection of blood specimen for laboratory"); // Anatomical Site (ANATOMICAL LOCATION) specimenDetailOne.AnatomicalSite = new List <AnatomicalSite> { CreateAnatomicalSite( BaseCDAModel.CreateCodableText("88738008", CodingSystem.SNOMED, "Subcutaneous tissue structure of lateral surface of index finger"), BaseCDAModel.CreateCodableText("7771000", CodingSystem.SNOMED, "Left"), new List <ExternalData> { BaseCDAModel.CreateExternalData(MediaType.JPEG, ImageFileNameAndPath, "Anatomical Site") } ), CreateAnatomicalSite( "Subcutaneous tissue structure of lateral surface of index finger" ), }; // Anatomical Location Description specimenDetailOne.PhysicalDescription = "Physical Details Description"; // Physical Details (PHYSICAL PROPERTIES OF AN OBJECT) specimenDetailOne.PhysicalDetails = new List <PhysicalDetails> { BaseCDAModel.CreatePhysicalDetails("6", "ml", BaseCDAModel.CreateExternalData(MediaType.PDF, AttachmentFileNameAndPath, "Physical Details One")) }; // Sampling Preconditions specimenDetailOne.SamplingPreconditions = BaseCDAModel.CreateCodableText("16985007", CodingSystem.SNOMED, "fasting"); // Collection Setting specimenDetailOne.CollectionSetting = "Ward 1A"; // Date and Time of Receipt (DateTime Received) specimenDetailOne.ReceivedDateTime = new ISO8601DateTime(DateTime.Now); // Parent Specimen Identifier specimenDetailOne.ParentSpecimenIdentifier = BaseCDAModel.CreateInstanceIdentifier("1.2.36.84425496912", BaseCDAModel.CreateGuid()); // Container Identifier specimenDetailOne.ContainerIdentifier = BaseCDAModel.CreateInstanceIdentifier("1.2.36.84425496912", BaseCDAModel.CreateGuid()); // Specimen Identifier specimenDetailOne.SpecimenIdentifier = BaseCDAModel.CreateInstanceIdentifier("1.2.36.84425496912", BaseCDAModel.CreateGuid()); } return(specimenDetailOne); }
/// <summary> /// Creates and hydrates the 'Pathology Test Results' section. /// </summary> /// <returns>A hydrated 'PathologyTestResult' object.</returns> public static PathologyTestResult CreatePathologyResults(Boolean mandatorySectionsOnly) { DateTimeNow = DateTime.Now; // Pathology test result PathologyTestResult pathologyTestResult = BaseCDAModel.CreatePathologyTestResult(); // Test Result Name pathologyTestResult.TestResultName = BaseCDAModel.CreateCodableText("104950002", CodingSystem.SNOMED, "Sulfhaemoglobin measurement"); // Diagnostic Service pathologyTestResult.DiagnosticService = DiagnosticServiceSectionID.Chemistry; // Overall Pathology Test Result Status pathologyTestResult.OverallTestResultStatus = BaseCDAModel.CreateCodableText(HL7ResultStatus.FinalResultsResultsStoredAndVerifiedCanOnlyBeChangedWithACorrectedResult); // Observation Date Time pathologyTestResult.ObservationDateTime = new ISO8601DateTime(DateTimeNow); if (!mandatorySectionsOnly) { // Clinical Information Provided pathologyTestResult.ClinicalInformationProvided = "Hepatitus"; //Pathological Diagnosis pathologyTestResult.PathologicalDiagnosis = new List <ICodableText> { BaseCDAModel.CreateCodableText("17621005", CodingSystem.SNOMED, "Normal"), BaseCDAModel.CreateCodableText("263654008", CodingSystem.SNOMED, "Abnormal") }; // Conclusion pathologyTestResult.Conclusion = "Test Result Group Conclusion"; // Test Result Representation pathologyTestResult.TestResultRepresentation = BaseCDAModel.CreateEncapsulatedData(); pathologyTestResult.TestResultRepresentation.ExternalData = BaseCDAModel.CreateExternalData(MediaType.PDF, AttachmentFileNameAndPath, "Test Result Representation"); // // Demonstrating Text for EncapsulatedData // //pathologyTestResult.TestResultRepresentation = BaseCDAModel.CreateEncapsulatedData(); //pathologyTestResult.TestResultRepresentation.Text = "Lipase 150 U/L (RR < 70)"; // Test Comment pathologyTestResult.TestComment = "Test Result Group Comment"; // Test request details one ITestRequest testRequestDetailsOne = BaseCDAModel.CreateTestRequest(); // Requester Order Identifier testRequestDetailsOne.RequesterOrderIdentifier = BaseCDAModel.CreateInstanceIdentifier("1.2.36.1.2001.1005.52.8003620833333789", "10523479"); // LaboratoryTestResultIdentifier testRequestDetailsOne.LaboratoryTestResultIdentifier = BaseCDAModel.CreateInstanceIdentifier(BaseCDAModel.CreateGuid(), "Laboratory Test Result Identifier"); // Tests Requested Name testRequestDetailsOne.TestsRequestedName = new List <ICodableText> { BaseCDAModel.CreateCodableText("401324008", CodingSystem.SNOMED, "Urinary microscopy, culture and sensitivities"), BaseCDAModel.CreateCodableText("401324008", CodingSystem.SNOMED, "Urinary microscopy, culture and sensitivities"), }; // Test Request Details pathologyTestResult.TestRequestDetails = new List <ITestRequest> { testRequestDetailsOne }; // Result Group (PATHOLOGY TEST RESULT GROUP) pathologyTestResult.ResultGroup = new List <ITestResultGroup> { CreateTestResultGroup(mandatorySectionsOnly) }; } else { // Reporting Pathologist pathologyTestResult.ReportingPathologist = CreateReportingPathologist(mandatorySectionsOnly); } pathologyTestResult.TestSpecimenDetail = new List <SpecimenDetail> { CreateTestSpecimenDetail(mandatorySectionsOnly) }; return(pathologyTestResult); }
/// <summary> /// This method populates an PCML model with either the mandatory sections only, or both /// the mandatory and optional sections /// </summary> /// <param name="mandatorySectionsOnly">mandatorySectionsOnly</param> /// <returns>PCML</returns> public static Nehta.VendorLibrary.CDA.Common.PCML PopulatePSML_1A(Boolean mandatorySectionsOnly) { var pharmacySharedMedsList = Nehta.VendorLibrary.CDA.Common.PCML.CreatePCML(); // Include Logo pharmacySharedMedsList.IncludeLogo = false; // Set Creation Time pharmacySharedMedsList.DocumentCreationTime = new ISO8601DateTime(DateTime.Now); #region Setup and populate the CDA context model // Setup and populate the CDA context model ICDAContextPCML cdaContext = Nehta.VendorLibrary.CDA.Common.PCML.CreateCDAContext(); // Document Id cdaContext.DocumentId = BaseCDAModel.CreateIdentifier(BaseCDAModel.CreateOid(), null); // Custodian cdaContext.Custodian = BaseCDAModel.CreateCustodian(); GenericObjectReuseSample.HydrateCustodian(cdaContext.Custodian, mandatorySectionsOnly); //Optional sections if (!mandatorySectionsOnly) { // Set Id cdaContext.SetId = BaseCDAModel.CreateIdentifier(BaseCDAModel.CreateOid(), null); // CDA Context Version cdaContext.Version = "1"; // Legal authenticator cdaContext.LegalAuthenticator = BaseCDAModel.CreateLegalAuthenticator(); GenericObjectReuseSample.HydrateAuthenticator(cdaContext.LegalAuthenticator, mandatorySectionsOnly); // Information Recipients cdaContext.InformationRecipients = new List <IParticipationInformationRecipient>(); var recipient1 = BaseCDAModel.CreateInformationRecipient(); GenericObjectReuseSample.HydrateRecipient(recipient1, RecipientType.Primary, mandatorySectionsOnly); var recipient2 = BaseCDAModel.CreateInformationRecipient(); GenericObjectReuseSample.HydrateRecipient(recipient2, RecipientType.Secondary, mandatorySectionsOnly); cdaContext.InformationRecipients.AddRange(new[] { recipient1, recipient2 }); } pharmacySharedMedsList.CDAContext = cdaContext; #endregion #region Setup and Populate the SCS Context model // Setup and Populate the SCS Context model pharmacySharedMedsList.SCSContext = Nehta.VendorLibrary.CDA.Common.PCML.CreateSCSContext(); var authorHealthcareProvider = BaseCDAModel.CreateAuthorHealthcareProvider(); GenericObjectReuseSample.HydrateAuthorHealthcareProvider(authorHealthcareProvider, mandatorySectionsOnly); pharmacySharedMedsList.SCSContext.Author = authorHealthcareProvider; //Cannot use as a device : prohibited by CORE Level One //pharmacyCuratedMedsList.SCSContext.Author = GenericObjectReuseSample.CreateAuthorDevice(); if (!mandatorySectionsOnly) { // Context>Encounter>HEALTHCARE FACILITY pharmacySharedMedsList.SCSContext.Encounter = new Encounter { HealthcareFacility = PopulateHealthcareFacility(mandatorySectionsOnly) }; } pharmacySharedMedsList.SCSContext.SubjectOfCare = BaseCDAModel.CreateSubjectOfCare(); GenericObjectReuseSample.HydrateSubjectofCare(pharmacySharedMedsList.SCSContext.SubjectOfCare, mandatorySectionsOnly); IParticipationPersonOrOrganisation person = Nehta.VendorLibrary.CDA.Common.PCML.CreateParticipationPersonOrOrganisation(); person.Participant = Nehta.VendorLibrary.CDA.Common.PCML.CreateParticipantPersonOrOrganisation(); person.Role = BaseCDAModel.CreateRole(HealthcareFacilityTypeCodes.AgedCareResidentialServices); person.Participant.Person = BaseCDAModel.CreatePersonWithOrganisation(); var name1 = BaseCDAModel.CreatePersonName(); name1.FamilyName = "Grant"; name1.GivenNames = new List <string> { "Sally", "Wally" }; name1.Titles = new List <string> { "Miss" }; name1.NameUsages = new List <NameUsage> { NameUsage.Legal }; person.Participant.Person.PersonNames = new List <IPersonName> { name1 }; // Subject of Care > Participant > Person or Organisation or Device > Person > Identifier person.Participant.Person.Identifiers = new List <Identifier> { BaseCDAModel.CreateHealthIdentifier(HealthIdentifierType.HPII, "8003615833334118") }; // Subject of Care > Participant > Person or Organisation or Device > Person > Demographic Data > Sex var address1 = BaseCDAModel.CreateAddress(); // MUST BE BUSINESS address1.AddressPurpose = AddressPurpose.Business; address1.AustralianAddress = BaseCDAModel.CreateAustralianAddress(); address1.AustralianAddress.UnstructuredAddressLines = new List <string> { "1 Clinician Street" }; address1.AustralianAddress.SuburbTownLocality = "Nehtaville"; address1.AustralianAddress.State = AustralianState.NSW; address1.AustralianAddress.PostCode = "5555"; address1.AustralianAddress.DeliveryPointId = 32568931; person.Participant.Addresses = new List <IAddress> { address1 }; person.Participant.Person.Organisation = BaseCDAModel.CreateEmploymentOrganisation(); person.Participant.Person.Organisation = BaseCDAModel.CreateEmploymentOrganisation(); person.Participant.Person.Organisation.Name = "Hay Bill Hospital"; person.Participant.Person.Organisation.NameUsage = OrganisationNameUsage.Other; // New requirement to make address mandatory person.Participant.Person.Organisation.Addresses = new List <IAddress> { address1 }; person.Participant.Person.Organisation.Identifiers = new List <Identifier> { BaseCDAModel.CreateHealthIdentifier(HealthIdentifierType.HPIO, "8003620833333789"), //BaseCDAModel.CreateIdentifier("SampleAuthority", null, null, "1.2.3.4.5.66666", null) }; if (!mandatorySectionsOnly) { //populate with full person details // Subject of Care > Participant > Address // Subject of Care > Participant > Person or Organisation or Device > Person > Demographic Data > Indigenous Status // Subject of Care > Participant > Electronic Communication Detail var coms1 = BaseCDAModel.CreateElectronicCommunicationDetail( "0345754566", ElectronicCommunicationMedium.Telephone, ElectronicCommunicationUsage.WorkPlace); var coms2 = BaseCDAModel.CreateElectronicCommunicationDetail( "*****@*****.**", ElectronicCommunicationMedium.Email, ElectronicCommunicationUsage.WorkPlace); person.Participant.ElectronicCommunicationDetails = new List <ElectronicCommunicationDetail> { coms1, coms2 }; // Subject of Care > Participant > Entitlement var entitlement1 = BaseCDAModel.CreateEntitlement(); entitlement1.Id = BaseCDAModel.CreateMedicareNumber(MedicareNumberType.MedicareCardNumber, "1234567881"); entitlement1.Type = EntitlementType.MedicareBenefits; entitlement1.ValidityDuration = BaseCDAModel.CreateInterval("1", TimeUnitOfMeasure.Year); var entitlement2 = BaseCDAModel.CreateEntitlement(); entitlement2.Id = BaseCDAModel.CreateMedicareNumber(MedicareNumberType.MedicareCardNumber, "1234567881"); entitlement2.Type = EntitlementType.MedicareBenefits; entitlement2.ValidityDuration = BaseCDAModel.CreateInterval("1", TimeUnitOfMeasure.Year); person.Participant.Entitlements = new List <Entitlement> { entitlement1, entitlement2 }; // Optional Participants pharmacySharedMedsList.SCSContext.Participant = new List <IParticipationPersonOrOrganisation>(); pharmacySharedMedsList.SCSContext.Participant.Add(person); } #endregion #region Setup and populate the SCS Content model // Setup and populate the SCS Content model pharmacySharedMedsList.SCSContent = Nehta.VendorLibrary.CDA.Common.PCML.CreateSCSContent(); pharmacySharedMedsList.SCSContent.EncapsulatedData = BaseCDAModel.CreateEncapsulatedData(); ExternalData report1 = BaseCDAModel.CreateExternalData(); report1.ExternalDataMediaType = MediaType.PDF; report1.Path = StructuredFileAttachment; report1.Caption = "Attachment One"; pharmacySharedMedsList.SCSContent.EncapsulatedData.ExternalData = report1; #endregion return(pharmacySharedMedsList); }