Beispiel #1
0
		public void AddMessage(HL7DefMessage msg,MessageTypeHL7 messageType,MessageStructureHL7 messageStructure,InOutHL7 inOrOut,int itemOrder,string note) {
			if(hl7DefMessages==null) {
				hl7DefMessages=new List<HL7DefMessage>();
			}
			msg.MessageType=messageType;
			msg.MessageStructure=messageStructure;
			msg.InOrOut=inOrOut;
			msg.ItemOrder=itemOrder;
			msg.Note=note;
			this.hl7DefMessages.Add(msg);
		}
Beispiel #2
0
 public void AddMessage(HL7DefMessage msg, MessageTypeHL7 messageType, MessageStructureHL7 messageStructure, InOutHL7 inOrOut, int itemOrder, string note)
 {
     if (hl7DefMessages == null)
     {
         hl7DefMessages = new List <HL7DefMessage>();
     }
     msg.MessageType      = messageType;
     msg.MessageStructure = messageStructure;
     msg.InOrOut          = inOrOut;
     msg.ItemOrder        = itemOrder;
     msg.Note             = note;
     this.hl7DefMessages.Add(msg);
 }
Beispiel #3
0
		public MessageHL7(string msgtext) {
			AckCode="";
			ControlId="";
			AckEvent="";
			originalMsgText=msgtext;
			Segments=new List<SegmentHL7>();
			string[] rows=msgtext.Split(new string[] { "\r","\n" },StringSplitOptions.RemoveEmptyEntries);
			//We need to get the separator characters in order to create the field objects.
			//The separators are part of the MSH segment and we force users to leave them in position 1 for incoming messages.
			Delimiters=new char[] { '^','~','\\','&' };//this is the default, but we will get them from the MSH segment of the incoming message in case they are using something unique.
			for(int i=0;i<rows.Length;i++) {
				string[] fields=rows[i].Split(new string[] { "|" },StringSplitOptions.None);
				if(fields.Length>1 && fields[0]=="MSH" && fields[1].Length>0) {
					//Encoding characters are in the following order:  component separator, repetition separator, escape character, subcomponent separator
					Delimiters=fields[1].ToCharArray();//we force users to leave the delimiters in position 1 of the MSH segment
					break;
				}
			}
			SegmentHL7 segment;
			for(int i=0;i<rows.Length;i++) {
				segment=new SegmentHL7(rows[i],Delimiters);//this creates the field objects.
				Segments.Add(segment);
				if(i==0 && segment.Name==SegmentNameHL7.MSH) {
//js 7/3/12 Make this more intelligent because we also now need the suffix
					string msgtype=segment.GetFieldComponent(8,0);//We force the user to leave the 'messageType' field in this position, position 8 of the MSH segment
					string evnttype=segment.GetFieldComponent(8,1);
					string msgStructure=segment.GetFieldComponent(8,2);
					AckEvent=evnttype;//We will use this when constructing the acknowledgment to echo back to sender the same event type sent to us
					//If message type or event type are not in this list, they will default to the not supported type and will not be processed
					try {
						MsgType=(MessageTypeHL7)Enum.Parse(typeof(MessageTypeHL7),msgtype,true);
					}
					catch(Exception ex) {
						MsgType=MessageTypeHL7.NotDefined;
					}
					try {
						EventType=(EventTypeHL7)Enum.Parse(typeof(EventTypeHL7),evnttype,true);
					}
					catch(Exception ex) {
						EventType=EventTypeHL7.NotDefined;
					}
					try {
						MsgStructure=(MessageStructureHL7)Enum.Parse(typeof(MessageStructureHL7),msgStructure,true);
					}
					catch(Exception ex) {
						MsgStructure=MessageStructureHL7.NotDefined;
					}
				}
			}
		}
Beispiel #4
0
		///<summary>apt, guar, proc, prov, pdfDescription, pdfDataString, patplanCur, inssubCur, insplanCur, carrierCur, and patSub can be null and will return an empty string if a field requires that object</summary>
		public static string GenerateField(HL7Def def,string fieldName,MessageTypeHL7 msgType,Patient pat,Provider prov,Procedure proc,Patient guar,Appointment apt,int sequenceNum,EventTypeHL7 eventType,string pdfDescription,string pdfDataString,MessageStructureHL7 msgStructure,SegmentNameHL7 segName) {
			string retval="";
			if(def.InternalType==HL7InternalType.eCWFull
				|| def.InternalType==HL7InternalType.eCWTight
				|| def.InternalType==HL7InternalType.eCWStandalone)
			{
				_isEcwDef=true;
			}
			//big long list of fieldnames that we support
			switch(fieldName) {
				#region Appointment
				case "apt.AptDateTime":
					if(apt==null) {
						return "";
					}
					return gDTM(apt.AptDateTime,14);
				case "apt.AptNum":
					if(apt==null) {
						return "";
					}
					if(_isEcwDef) {
						return apt.AptNum.ToString();
					}
					//We will use AptNum, with the OIDRoot for an appt object (set in oidinternal), and ID Type 'HL7'
					OIDInternal aptOid=OIDInternals.GetForType(IdentifierType.Appointment);
					string aptOidRoot="";
					if(aptOid!=null) {
						aptOidRoot=aptOid.IDRoot;
					}
					//For PV1 segments, the data type is a CX, which has the AptNum, check digit, check digit scheme, assigning authority - &universalID&universalIDType, IDType
					//We will use the check digit scheme M11, their appt OID with "HL7" as the type for assigning authority, and the ID type is VN - Visit Number
					//Example: |1234^3^M11^&2.16.840.1.113883.3.4337.1486.6566.6&HL7^VN|
					if(segName==SegmentNameHL7.PV1) {
						string strCheckDigit=MessageParser.M11CheckDigit(apt.AptNum.ToString()).ToString();
						string strCheckDigitScheme="M11";
						if(strCheckDigit=="-1") {
							strCheckDigit="";
							strCheckDigitScheme="";
						}
						return gConcat(def.ComponentSeparator,apt.AptNum.ToString(),strCheckDigit,strCheckDigitScheme,gConcat(def.SubcomponentSeparator,"",aptOidRoot,"HL7"),"VN");
					}
					//For segments other than PV1 (currently SCH or ARQ segments) the data type is EI
					//Example: |1234^^2.16.840.1.113883.3.4337.1486.6566.6^HL7|
					return gConcat(def.ComponentSeparator,apt.AptNum.ToString(),"",aptOidRoot,"HL7");
				case "apt.aptStatus":
					if(apt==null) {
						return "";
					}
					if(apt.AptStatus==ApptStatus.Complete) {
						return "Complete";
					}
					if(apt.AptStatus==ApptStatus.UnschedList || apt.AptStatus==ApptStatus.Broken) {
						return "Cancelled";
					}
					if(eventType==EventTypeHL7.S17) {//S17 is event type for outbound SIU messages when we delete an appointment
						return "Deleted";
					}
					//apt.AptStatus==ApptStatus.Scheduled or apt.AptStatus==ApptStatus.ASAP or other status that triggers an SCH segment
					return "Booked";
				case "apt.confirmStatus":
					if(apt==null) {
						return "";
					}
					//Example: |^Appointment Confirmed|
					return gConcat(def.ComponentSeparator,"",DefC.GetName(DefCat.ApptConfirmed,apt.Confirmed));//this will return an empty string if apt.Confirmed is 0 or invalid
				case "apt.endAptDateTime":
					if(apt==null) {
						return "";
					}
					return gDTM(apt.AptDateTime.AddMinutes(5*apt.Pattern.Length),14);
				case "apt.externalAptID":
					//EntityID^NamespaceID^UniversalID^UniversalIDType
					//Example: |12345^^OtherSoftware.Root^|
					if(apt==null) {
						return "";
					}
					List<OIDExternal> listAptOidsExt=OIDExternals.GetByInternalIDAndType(apt.AptNum,IdentifierType.Appointment);
					if(listAptOidsExt.Count==0) {
						return "";
					}
					return gConcat(def.ComponentSeparator,listAptOidsExt[0].IDExternal,"",listAptOidsExt[0].rootExternal,"");
				case "apt.location":
					//Point of Care^Room^^Facility^^Person Location Type
					//Example: ClinicDescript^OpName^^&PracticeTitle^^C  (C for clinic)
					//use operatory and clinic from appt
					if(apt==null) {
						return "";
					}
					string aptClinicDescript=Clinics.GetDesc(apt.ClinicNum);
					Operatory opCur=Operatories.GetOperatory(apt.Op);
					string opName="";
					if(opCur!=null) {
						opName=opCur.OpName;
					}
					string practiceName=PrefC.GetString(PrefName.PracticeTitle);
					return gConcat(def.ComponentSeparator,aptClinicDescript,opName,"",def.SubcomponentSeparator+practiceName,"","C");//all of these could be empty strings and it works fine
				case "apt.length":
					//Example: 60^min&&ANS+, ANS+ is the name of the coding system
					if(apt==null) {
						return "";
					}
					return gConcat(def.ComponentSeparator,(5*apt.Pattern.Length).ToString(),gConcat(def.SubcomponentSeparator,"min","","ANS+"));
				case "apt.Note":
					//As in the address note field (see PID.11) we will send '\.br\' (where the '\' is the defined escape char, \ by default) to signal a new line.
					if(apt==null) {
						return "";
					}
					return gNewLines(def.EscapeCharacter,apt.Note);
				case "apt.operatory":
					if(apt==null) {
						return "";
					}
					opCur=Operatories.GetOperatory(apt.Op);
					if(opCur==null) {
						return "";
					}
					return opCur.OpName;
				case "apt.type":
					//Suggested values are Normal - Routine schedule request type, Tentative, or Complete - Request to add a completed appt
					//We will send Normal for all appointment statuses except complete.
					if(apt==null) {
						return "";
					}
					if(apt.AptStatus==ApptStatus.Complete) {
						return "Complete";
					}
					return "Normal";
				case "apt.userOD":
					//The OD user who created/modified the appointment
					if(apt==null) {
						return "";
					}
					//SRR messages are generated from the service in response to SRM messages, therefore we do not have a user logged in.
					if(msgType==MessageTypeHL7.SRR) {
						return "OpenDentalHL7";
					}
					if(Security.CurUser!=null) {
						return Security.CurUser.UserName;
					}
					return "";
				#endregion Appointment
				case "dateTime.Now":
					return gDTM(DateTime.Now,14);
				case "eventType":
					return eventType.ToString();
				#region Guarantor
				case "guar.addressCityStateZip":
					if(guar==null) {
						return "";
					}
					retval=gConcat(def.ComponentSeparator,guar.Address,guar.Address2,guar.City,guar.State,guar.Zip);
					if(!_isEcwDef) {
						//Example: 123 Main St^Apt 1^Dallas^OR^97338^^^^^^^^^^^^^^^Emergency Contact: Mom Test1\.br\Mother\.br\(503)623-3072
						retval=gConcat(def.ComponentSeparator,retval,"","","","","","","","","","","","","","",gNewLines(def.EscapeCharacter,guar.AddrNote));
					}
					return retval;
				case "guar.birthdateTime":
					if(guar==null) {
						return "";
					}
					return gDTM(guar.Birthdate,8);
				case "guar.Gender":
					if(guar==null) {
						return "";
					}
					return gIS(guar);
				case "guar.HmPhone":
					if(guar==null) {
						return "";
					}
					string hmPh=gXTN(guar.HmPhone,10);
					string cPh=gXTN(guar.WirelessPhone,10);
					if(_isEcwDef) {
						return hmPh;
					}
					//PRN stands for Primary Residence Number, equipment type: PH is Telephone, CP is Cell Phone, Internet is Internet Address (email)
					//Example: ^PRN^PH^^^503^3635432~^PRN^Internet^[email protected]~^PRN^CP^^^503^6895555
					if(hmPh!="") {
						retval=gConcat(def.ComponentSeparator,"","PRN","PH","","",hmPh.Substring(0,3),hmPh.Substring(3));//hmPh guaranteed to be 10 digits if not blank
					}
					if(cPh!="") {
						if(retval!="") {
							retval+=def.RepetitionSeparator;
						}
						retval+=gConcat(def.ComponentSeparator,"","PRN","CP","","",cPh.Substring(0,3),cPh.Substring(3));//cPh guaranteed to be 10 digits if not blank
					}
					if(guar.Email!="") {
						if(retval!="") {
							retval+=def.RepetitionSeparator;
						}
						retval+=gConcat(def.ComponentSeparator,"","PRN","Internet",guar.Email);
					}
					return retval;
				case "guar.nameLFM":
					if(guar==null) {
						return "";
					}
					return gConcat(def.ComponentSeparator,guar.LName,guar.FName,guar.MiddleI);
				case "guar.PatNum":
					if(guar==null) {
						return "";
					}
					return guar.PatNum.ToString();
				case "guar.SSN":
					if(guar==null) {
						return "";
					}
					return guar.SSN;
				case "guar.WkPhone":
					if(guar==null) {
						return "";
					}
					string wkPh=gXTN(guar.WkPhone,10);
					if(_isEcwDef) {
						return wkPh;
					}
					//WPN stands for Work Number, equipment type: PH is Telephone
					//Example: ^WPN^PH^^^503^3635432
					if(wkPh=="") {
						return "";
					}
					return gConcat(def.ComponentSeparator,"","WPN","PH","","",wkPh.Substring(0,3),wkPh.Substring(3));//wkPh guaranteed to be 10 digits if not blank
				case "guarIdList":
					if(guar==null) {
						return "";
					}
					//Example: |1234^3^M11^&2.16.840.1.113883.3.4337.1486.6566.2&HL7^PI~7684^8^M11^&Other.Software.OID&^PI|
					OIDInternal guarOid=OIDInternals.GetForType(IdentifierType.Patient);
					string guarOidRoot="";
					if(guarOid!=null) {
						guarOidRoot=guarOid.IDRoot;
					}
					string guarIdCheckDigitStr=MessageParser.M11CheckDigit(guar.PatNum.ToString()).ToString();
					retval=gConcat(def.ComponentSeparator,guar.PatNum.ToString(),guarIdCheckDigitStr,"M11",def.SubcomponentSeparator+guarOidRoot+def.SubcomponentSeparator+"HL7","PI");
					List<OIDExternal> listGuarOidsExt=OIDExternals.GetByInternalIDAndType(guar.PatNum,IdentifierType.Patient);
					for(int i=0;i<listGuarOidsExt.Count;i++) {
						guarIdCheckDigitStr=MessageParser.M11CheckDigit(listGuarOidsExt[i].IDExternal).ToString();
						if(guarIdCheckDigitStr=="-1") {//could not get a check digit from the external ID, could contain characters that are not numbers
							retval+=def.RepetitionSeparator+gConcat(def.ComponentSeparator,listGuarOidsExt[i].IDExternal,"","",
								def.SubcomponentSeparator+listGuarOidsExt[i].rootExternal+def.SubcomponentSeparator,"PI");
							continue;
						}
						retval+=def.RepetitionSeparator+gConcat(def.ComponentSeparator,listGuarOidsExt[i].IDExternal,guarIdCheckDigitStr,"M11",
							def.SubcomponentSeparator+listGuarOidsExt[i].rootExternal+def.SubcomponentSeparator,"PI");
					}
					return retval;
				#endregion Guarantor
				case "messageControlId":
					return Guid.NewGuid().ToString("N");
				case "messageType":
					return gConcat(def.ComponentSeparator,msgType.ToString(),eventType.ToString(),msgStructure.ToString());
				#region Patient
				case "pat.addressCityStateZip":
					retval=gConcat(def.ComponentSeparator,pat.Address,pat.Address2,pat.City,pat.State,pat.Zip);
					if(!_isEcwDef) {
						//Example: 123 Main St^Apt 1^Dallas^OR^97338^^^^^^^^^^^^^^^Emergency Contact: Mom Test1\.br\Mother\.br\(503)623-3072
						retval=gConcat(def.ComponentSeparator,retval,"","","","","","","","","","","","","","",gNewLines(def.EscapeCharacter,pat.AddrNote));
					}
					return retval;
				case "pat.birthdateTime":
					return gDTM(pat.Birthdate,8);
				case "pat.ChartNumber":
					return pat.ChartNumber;
				case "pat.Gender":
					return gIS(pat);
				case "pat.HmPhone":
					hmPh=gXTN(pat.HmPhone,10);
					cPh=gXTN(pat.WirelessPhone,10);
					if(_isEcwDef) {
						return hmPh;
					}
					//PRN stands for Primary Residence Number, equipment type: PH is Telephone, CP is Cell Phone, Internet is Internet Address (email)
					//Example: ^PRN^PH^^^503^3635432~^PRN^Internet^[email protected]~^PRN^CP^^^503^6895555
					if(hmPh!="") {
						retval=gConcat(def.ComponentSeparator,"","PRN","PH","","",hmPh.Substring(0,3),hmPh.Substring(3));//hmPh guaranteed to be 10 digits if not blank
					}
					if(cPh!="") {
						if(retval!="") {
							retval+=def.RepetitionSeparator;
						}
						retval+=gConcat(def.ComponentSeparator,"","PRN","CP","","",cPh.Substring(0,3),cPh.Substring(3));//cPh guaranteed to be 10 digits if not blank
					}
					if(pat.Email!="") {
						if(retval!="") {
							retval+=def.RepetitionSeparator;
						}
						retval+=gConcat(def.ComponentSeparator,"","PRN","Internet",pat.Email);
					}
					return retval;
				case "pat.location":
					//Point of Care^Room^^Facility^^Person Location Type
					//Example: ClinicDescript^OpName^^&PracticeTitle^^C  (C for clinic)
					if(pat.ClinicNum==0) {
						return "";
					}
					string patClinicDescript=Clinics.GetDesc(pat.ClinicNum);
					practiceName=PrefC.GetString(PrefName.PracticeTitle);
					return gConcat(def.ComponentSeparator,patClinicDescript,"","",def.SubcomponentSeparator+practiceName,"","C");
				case "pat.nameLFM":
					return gConcat(def.ComponentSeparator,pat.LName,pat.FName,pat.MiddleI);
				case "pat.PatNum":
					return pat.PatNum.ToString();
				case "pat.Position":
					if(_isEcwDef) {
						return gPos(pat);
					}
					return gPos(pat).Substring(0,1);//S-Single, M-Married, D-Divorced, W-Widowed
				case "pat.Race":
					if(_isEcwDef) {
						return gRaceOld(pat);
					}
					return gRace(pat,def);
				case "pat.site":
					//Example: |West Salem Elementary^^^^^S| ('S' for site)
					if(pat.SiteNum==0) {
						return "";
					}
					string patSiteDescript=Sites.GetDescription(pat.SiteNum);
					if(patSiteDescript=="") {
						return "";
					}
					return gConcat(def.ComponentSeparator,patSiteDescript,"","","","","","S");
				case "pat.SSN":
					return pat.SSN;
				case "pat.WkPhone":
					if(_isEcwDef) {
						return gXTN(pat.WkPhone,10);
					}
					//WPN stands for Work Number, equipment type: PH is Telephone
					//Example: ^WPN^PH^^^503^3635432
					wkPh=gXTN(pat.WkPhone,10);
					if(wkPh=="") {
						return "";
					}
					return gConcat(def.ComponentSeparator,"","WPN","PH","","",wkPh.Substring(0,3),wkPh.Substring(3));//wkPh guaranteed to be 10 digits if not blank
				case "pat.Urgency":
					//We will send one of the following values retrieved from the patient.Urgency field for treatment urgency: 0-Unknown, 1-NoProblems, 2-NeedsCare, 3-Urgent
					return ((int)pat.Urgency).ToString();
				case "patientIds":
					//Example: |1234^3^M11^&2.16.840.1.113883.3.4337.1486.6566.2&HL7^PI~7684^8^M11^&Other.Software.OID&^PI|
					OIDInternal patOid=OIDInternals.GetForType(IdentifierType.Patient);
					string patOidRoot="";
					if(patOid!=null) {
						patOidRoot=patOid.IDRoot;
					}
					string patIdCheckDigitStr=MessageParser.M11CheckDigit(pat.PatNum.ToString()).ToString();
					retval=gConcat(def.ComponentSeparator,pat.PatNum.ToString(),patIdCheckDigitStr,"M11",def.SubcomponentSeparator+patOidRoot+def.SubcomponentSeparator+"HL7","PI");
					List<OIDExternal> listPatOidsExt=OIDExternals.GetByInternalIDAndType(pat.PatNum,IdentifierType.Patient);
					for(int i=0;i<listPatOidsExt.Count;i++) {
						patIdCheckDigitStr=MessageParser.M11CheckDigit(listPatOidsExt[i].IDExternal).ToString();
						if(patIdCheckDigitStr=="-1") {//could not get a check digit from the external ID, could contain characters that are not numbers
							retval+=def.RepetitionSeparator+gConcat(def.ComponentSeparator,listPatOidsExt[i].IDExternal,"","",
								def.SubcomponentSeparator+listPatOidsExt[i].rootExternal+def.SubcomponentSeparator,"PI");
							continue;
						}
						retval+=def.RepetitionSeparator+gConcat(def.ComponentSeparator,listPatOidsExt[i].IDExternal,patIdCheckDigitStr,"M11",
							def.SubcomponentSeparator+listPatOidsExt[i].rootExternal+def.SubcomponentSeparator,"PI");
					}
					return retval;
				#endregion Patient
				case "pdfDescription":
					if(pdfDescription==null) {
						return "";
					}
					return pdfDescription;
				case "pdfDataAsBase64":
					if(pdfDataString==null) {
						return "";
					}
					else {
						return pdfDataString;
					}
				#region Procedure
				case "proc.DiagnosticCode":
					if(proc==null) {
						return "";
					}
					List<string> listDiagCodes=new List<string>();
					if(proc.DiagnosticCode!=null && proc.DiagnosticCode!="") {
						listDiagCodes.Add(proc.DiagnosticCode);
					}
					if(proc.DiagnosticCode2!=null && proc.DiagnosticCode2!="") {
						listDiagCodes.Add(proc.DiagnosticCode2);
					}
					if(proc.DiagnosticCode3!=null && proc.DiagnosticCode3!="") {
						listDiagCodes.Add(proc.DiagnosticCode3);
					}
					if(proc.DiagnosticCode4!=null && proc.DiagnosticCode4!="") {
						listDiagCodes.Add(proc.DiagnosticCode4);
					}
					for(int i=0;i<listDiagCodes.Count;i++) {
						if(retval!="") {
							retval+=def.RepetitionSeparator;
						}
						ICD9 icd9Cur=ICD9s.GetByCode(listDiagCodes[i]);
						if(icd9Cur==null) {//not a valid ICD9 code or not in the ICD9 table, just stick in the code they have in OD
							retval+=listDiagCodes[i];
							continue;
						}
						retval+=gConcat(def.ComponentSeparator,listDiagCodes[i],icd9Cur.Description,"I9C","","","","31");
					}
					return retval;
				case "proc.location":
					//Point of Care^Room^^Facility^^Person Location Type
					//Example: ClinicDescript^OpName^^&PracticeTitle^^C  (C for clinic)
					if(proc==null || (proc.ClinicNum==0 && pat.ClinicNum==0)) {//if proc is null and both pat.ClinicNum and proc.ClinicNum are 0, return empty string
						return "";
					}
					string procClinicDescript=Clinics.GetDesc(proc.ClinicNum);//could be blank if proc.ClinicNum is invalid
					if(procClinicDescript=="") {
						procClinicDescript=Clinics.GetDesc(pat.ClinicNum);//could be blank if pat.ClinicNum is invalid
					}
					string procOpName="";
					if(apt!=null) {
						Operatory procOp=Operatories.GetOperatory(apt.Op);
						if(procOp!=null) {
							procOpName=procOp.OpName;
						}
					}
					practiceName=PrefC.GetString(PrefName.PracticeTitle);
					return gConcat(def.ComponentSeparator,procClinicDescript,procOpName,"",def.SubcomponentSeparator+practiceName,"","C");
				case "proc.procDateTime":
					if(proc==null) {
						return "";
					}
					return gDTM(proc.ProcDate,8);
				case "proc.ProcFee":
					if(proc==null) {
						return "";
					}
					return proc.ProcFee.ToString("F2");
				case "proc.ProcNum":
					if(proc==null) {
						return "";
					}
					return proc.ProcNum.ToString();
				case "proc.toothSurfRange":
					if(proc==null) {
						return "";
					}
					if(_isEcwDef) {
						return gTreatArea(def.ComponentSeparator,proc,def.IsQuadAsToothNum);
					}
					else {
						return gTreatArea(def.SubcomponentSeparator,proc,def.IsQuadAsToothNum);
					}
				case "proccode.ProcCode":
					if(proc==null) {
						return "";
					}
					if(_isEcwDef) {
						return gProcCodeOld(proc);
					}
					//ProcNum^Descript^CD2^^^^2014^^LaymanTerm
					//Example: D0150^comprehensive oral evaluation - new or established patient^CD2^^^^2014^^Comprehensive Exam
					return gProcCode(proc,def);
				#endregion Procedure
				#region Provider
				case "prov.provIdNameLFM":
					if(prov==null) {
						return "";
					}
					if(_isEcwDef) {
						return gConcat(def.ComponentSeparator,prov.EcwID,prov.LName,prov.FName,prov.MI);
					}
					//Will return all provider IDs in the oidexternals table linked to this provider as repetitions
					//For an AIG, the provider name is one component in the form LName, FName MI and the fourth component is the provider abbreviation
					//For a PV1 or AIP, the provider name is separated into three components like LName^FName^MI and the sixth component is the provider abbreviation
					//AIG Example: |2.16.840.1.113883.3.4337.1486.6566.3.1^Abbott, Sarah L, DMD^^DrAbbott~OtherSoftware.Root.Provider.ProvID^Abbott, Sarah L, DMD^^DrAbbott|
					//PV1 or AIP Example: 2.16.840.1.113883.3.4337.1486.6566.3.1^Abbott^Sarah^L^DMD^DrAbbott~OtherSoftware.Root.Provider.ProvID^Abbott^Sarah^L^DMD^DrAbbott
					List<OIDExternal> listProvOidExt=OIDExternals.GetByInternalIDAndType(prov.ProvNum,IdentifierType.Provider);
					string provName="";
					if(segName==SegmentNameHL7.AIG) {
						provName=prov.LName+", "+prov.FName+" "+prov.MI+", "+prov.Suffix;
					}
					else {
						provName=gConcat(def.ComponentSeparator,prov.LName,prov.FName,prov.MI,prov.Suffix);
					}
					retval=gConcat(def.ComponentSeparator,OIDInternals.GetForType(IdentifierType.Provider).IDRoot+"."+prov.ProvNum,provName,prov.Abbr);
					for(int i=0;i<listProvOidExt.Count;i++) {
						retval+=def.RepetitionSeparator+gConcat(def.ComponentSeparator,listProvOidExt[i].rootExternal+"."+listProvOidExt[i].IDExternal,provName,prov.Abbr);
					}
					return retval;
				case "prov.provType":
					if(prov==null) {
						return "";
					}
					if(apt==null) {
						if(prov.IsSecondary) {
							return "H";
						}
						return "D";
					}
					//if we have an appt, return 'D' if prov is the dentist and 'H' if prov is the hygienist, regardless of whether they are marked secondary or not
					if(prov.ProvNum==apt.ProvHyg) {
						return "H";
					}
					return "D";//default to 'D' - dentist
				#endregion Provider
				case "segmentAction":
					//This is currently only supported for SIU and SRR messages in the RSG, AIL, and AIP segments
					//A-Add/Insert, D-Delete, U-Update, X-No Change
					//SIU.S12 - Create Appt, S13 - Appt Rescheduling, S14 - Appt Modification, S15 - Appt Cancellation, S17 - Appt Deletion
					//SRR.S03 - Request Appointment Modification, S04 - Request Appointment Cancellation
					if(msgType==MessageTypeHL7.SIU && eventType==EventTypeHL7.S12) {
						return "A";
					}
					if(msgType==MessageTypeHL7.SRR //all SRR messages are for updating existing appts, 'U'
						|| (msgType==MessageTypeHL7.SIU
						&& (eventType==EventTypeHL7.S13 || eventType==EventTypeHL7.S14 || eventType==EventTypeHL7.S15))) //SIU's with event type S13, S14, or S15 are for updating existing appts
					{
						return "U";
					}
					if(msgType==MessageTypeHL7.SIU && eventType==EventTypeHL7.S17) {
						return "D";
					}
					return "";//if not an SIU or SRR or if it is not one of these event types, return empty string
				case "sendingApp":
					//HD data type, Namespace ID^UniversalID^UniversalIDType
					//UniversalID=oidinternal.IDRoot for IDType of Root, UniversalIDType=HL7
					//If no value in oidinternal table, then revert to 'OD'
					OIDInternal oidRoot=OIDInternals.GetForType(IdentifierType.Root);
					if(oidRoot==null) {
						return "OD";
					}
					return gConcat(def.ComponentSeparator,"",oidRoot.IDRoot,"HL7");
				case "separators^~\\&":
					return gSep(def);
				case "sequenceNum":
					return sequenceNum.ToString();
				default:
					return "";
			}
		}
Beispiel #5
0
 public void AddMessage(HL7DefMessage msg, MessageTypeHL7 messageType, MessageStructureHL7 messageStructure, InOutHL7 inOrOut, int itemOrder)
 {
     AddMessage(msg, messageType, messageStructure, inOrOut, itemOrder, "");
 }
Beispiel #6
0
        public MessageHL7(string msgtext)
        {
            AckCode         = "";
            ControlId       = "";
            AckEvent        = "";
            originalMsgText = msgtext;
            Segments        = new List <SegmentHL7>();
            string[] rows = msgtext.Split(new string[] { "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries);
            //We need to get the separator characters in order to create the field objects.
            //The separators are part of the MSH segment and we force users to leave them in position 1 for incoming messages.
            Delimiters = new char[] { '^', '~', '\\', '&' };       //this is the default, but we will get them from the MSH segment of the incoming message in case they are using something unique.
            //if def is enabled, set delimiters to user defined values
            HL7Def enabledDef = HL7Defs.GetOneDeepEnabled();

            if (enabledDef != null)
            {
                for (int i = 0; i < rows.Length; i++)
                {
                    //we're going to assume that the user has not inserted an escaped '|' before the second field of the message and just split by '|'s without
                    //checking for escaped '|'s.  Technically '\|' would be a literal pipe and should not indicate a new field, but we only want to retrieve the
                    //delimiters from MSH.1 and we require field 0 to be MSH and field 1 should be ^~\&.
                    string[] fields = rows[i].Split(new string[] { "|" }, StringSplitOptions.None);
                    if (fields.Length > 1 && fields[0] == "MSH" && fields[1].Length == 4)
                    {
                        //Encoding characters are in the following order:  component separator, repetition separator, escape character, subcomponent separator
                        Delimiters = fields[1].ToCharArray();                      //we force users to leave the delimiters in position 1 of the MSH segment
                        break;
                    }
                }
            }
            SegmentHL7 segment;

            for (int i = 0; i < rows.Length; i++)
            {
                segment = new SegmentHL7(rows[i], Delimiters);             //this creates the field objects.
                Segments.Add(segment);
                if (i == 0 && segment.Name == SegmentNameHL7.MSH)
                {
//js 7/3/12 Make this more intelligent because we also now need the suffix
                    string msgtype      = segment.GetFieldComponent(8, 0);            //We force the user to leave the 'messageType' field in this position, position 8 of the MSH segment
                    string evnttype     = segment.GetFieldComponent(8, 1);
                    string msgStructure = segment.GetFieldComponent(8, 2);
                    AckEvent = evnttype;                  //We will use this when constructing the acknowledgment to echo back to sender the same event type sent to us
                    //If message type or event type are not in this list, they will default to the not supported type and will not be processed
                    try {
                        MsgType = (MessageTypeHL7)Enum.Parse(typeof(MessageTypeHL7), msgtype, true);
                    }
                    catch (Exception ex) {
                        ex.DoNothing();
                        MsgType = MessageTypeHL7.NotDefined;
                    }
                    try {
                        EventType = (EventTypeHL7)Enum.Parse(typeof(EventTypeHL7), evnttype, true);
                    }
                    catch (Exception ex) {
                        ex.DoNothing();
                        EventType = EventTypeHL7.NotDefined;
                    }
                    try {
                        MsgStructure = (MessageStructureHL7)Enum.Parse(typeof(MessageStructureHL7), msgStructure, true);
                    }
                    catch (Exception ex) {
                        ex.DoNothing();
                        MsgStructure = MessageStructureHL7.NotDefined;
                    }
                }
            }
        }
Beispiel #7
0
		public void AddMessage(HL7DefMessage msg,MessageTypeHL7 messageType,MessageStructureHL7 messageStructure,InOutHL7 inOrOut,int itemOrder) {
			AddMessage(msg,messageType,messageStructure,inOrOut,itemOrder,"");
		}