VEPER7SG ;DOQ-IT HL7 Segment generation routine ; 10/11/05 10:22am ;;1.0;VOE;;Nov 16, 2005 FHS(SF,FHSC,BHSC,PROD,FNM,FNMID) ;File Header Segment ; ; SF - Sending Facility ; FHSC - File Header Segment id & count *** PASS BY REFERENCE *** ; BHSC - Batch Header Segment Count *** ; PROD - Production indicator ; FNM - File name ; FNMID - Facility UPIN # ; S FNM=$P(FNM,"\",3) ;***CBF*** RESET FNM S TP=$S(PROD:"PROD",1:"TEST") S FHSC=FHSC+1,BHSC=0 W "FHS|^~\&|VISTAEHR|"_SF_"|||||"_FNMID_"|"_TP_"|"_FNM_"||||||||||" W ! Q ; ; BHS(SF,BHSC,MSHC) ;Batch Header Segment ; S BHSC=BHSC+1,MSHC=0 W "BHS|^~\&|VISTAEHR|"_SF_"|||||||BHS"_$E(1000+BHSC,2,4)_"|||||" W ! Q ; MSH(MC,TE,SF,MSHC) ;Message Header Segment ; ; MC - Message code first piece of MSH-9 ; TE - Trigger Event second piece of MSH-9 ; MSHC - Message Control ID Counter ; N X,C1,CC,DTTM S DTTM=$$DTCALC("T","N")_"00" S MSHC=MSHC+1 W "MSH|^~\&|VISTAEHR|"_SF_"|DOQ-IT||"_DTTM_"||"_MC_"^"_TE_"|MSG"_$E(100000+MSHC,2,99)_"|P|2.5||||" W ! Q ; EVN(EVNTYPE) ;EVENT TYPE SEGMENT ; N REC S REC="" S $P(REC,"|")=EVNTYPE S $P(REC,"|",2)=DTZ W "EVN|"_REC W ! Q ; ZCR ;Primary Practice segment data ; N REC S REC="" ; Pieces 1-11 Are Primary Clinic Information S $P(REC,"|",1)=CONFIG(19904.5,CFGIEN,.02) ; Group Upin S $P(REC,"|",2)=CONFIG(19904.5,CFGIEN,.03) ; Name S PCADD=CONFIG(19904.5,CFGIEN,.04)_"^"_CONFIG(19904.5,CFGIEN,.05)_"^"_CONFIG(19904.5,CFGIEN,.06) ; Primary Clinic Address 1~2 S $P(REC,"|",3)=PCADD ;Primary Clinic Address S $P(REC,"|",4)=CONFIG(19904.5,CFGIEN,.07) ; City S $P(REC,"|",5)=CONFIG(19904.5,CFGIEN,.071) ; State S $P(REC,"|",6)=CONFIG(19904.5,CFGIEN,.072) ; Zip S $P(REC,"|",7)=CONFIG(19904.5,CFGIEN,.081) ; Phone S $P(REC,"|",8)=CONFIG(19904.5,CFGIEN,.083) ; Email S $P(REC,"|",9)=CLSTDT ; Start Date S $P(REC,"|",10)=CLENDT ; End Date S $P(REC,"|",11)=CONFIG(19904.5,CFGIEN,.08) ; Contact Name W "ZCR|"_REC W ! Q ; ZPP ;Practice Patients segment data ; N REC,PTFNM,PTLNM,PTMI,EG,PS,X,RACE,SEX S REC="" S $P(REC,"|",1)=CONFIG(19904.5,CFGIEN,.02) ;Primary Clinic Group Upin S $P(REC,"|",2)="MR" ;Patient ID List Code Sys ; ;***CBF*** Patient ID - need to find in IHS patient file ; N PATDFN,DOQPATID S PATDFN=$P($O(DOQREG("19904.4","")),",") S DOQPATID=$P(^AUPNPAT(PATDFN,41,DUZ(2),0),"^",2) S $P(REC,"|",3)=DOQPATID S PTLNM=$P(VEPER7PT(2,DFN,.01),","),PTFNM=$P(VEPER7PT(2,DFN,.01),",",2) S PTMI=$E($P(PTFNM," ",2)) S $P(REC,"|",4)=$P(PTFNM," ") ;Patient First Name S $P(REC,"|",5)=PTMI ; Middle Initial S $P(REC,"|",6)=PTLNM ; Last Name S $P(REC,"|",7)=PRIPHN ;PRIMARY PHYSICIAN UPIN S $P(REC,"|",8)=$P($$FMTHL7^XLFDT(VEPER7PT(2,DFN,.03,"I")),"-") ; DOB ; ; ***CBF*** ETHNIC GROUP, SEX, RACE AND PAYSOURCE ARE REQUIRED AND NEED TO BE HL7 ENCODED ; S EG=$O(VEPER7PT(2.06,"")) I EG'="" S EG=$G(VEPER7PT(2.06,EG,.01)) S EG=$S(EG="HISPANIC OR LATINO":"H",EG="NOT HISPANIC OR LATINO":"N",1:"U") S $P(REC,"|",9)=EG ; S SEX=VEPER7PT(2,DFN,.02) S $P(REC,"|",10)=$S(SEX="MALE":"M",SEX="FEMALE":"F",1:"U") ; S RACE=VEPER7PT(2,DFN,.06) S RACE=$S(RACE="AMERICAN INDIAN OR ALASKA NATIVE":"1002-5",RACE="ASIAN":"2028-9",RACE="BLACK OR AFRICAN AMERICAN":"2054-5",RACE="NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER":"2076-8",RACE="WHITE":"2106-3",1:"2131-1") S $P(REC,"|",11)=RACE S $P(REC,"|",12)=DOQREG(19904.4,PATDFN_",",".014") ;Paysource S $P(REC,"|",13)=DOQREG(19904.4,PATDFN_",",".015") ;HIC # S $P(REC,"|",14)=$S(VEPER7PT(2,DFN,.09)?9N:VEPER7PT(2,DFN,.09),1:"") ;SSN S BENEADD=VEPER7PT(2,DFN,.2914)_"~"_VEPER7PT(2,DFN,.2915) S $P(REC,"|",15)=BENEADD ;BENEFACTOR ADDRESS S $P(REC,"|",16)=VEPER7PT(2,DFN,.2916) ; " CITY S $P(REC,"|",17)=VEPER7PT(2,DFN,.2917) ; " STATE S $P(REC,"|",18)=VEPER7PT(2,DFN,.2918) ; " ZIP W "ZPP|"_REC W ! Q ; ; DG1 ;Diagnosis segment ; ;***CBF*** THERE COULD BE MORE THAN ONE DIAGNOSIS, NEED TO LOOP AND FIND THEM ALL ; N PATDFN2,TRACE S TRACE="",PATDFN2=$P(DFN,","),SETID=0 F S TRACE=$O(^AUPNPROB("AC",PATDFN2,TRACE)) Q:'TRACE D .I $P($G(^AUPNPROB(TRACE,0)),"^",12)'="A" Q .D GETS^DIQ(9000011,TRACE_",","**","","VEPER7PT") .S X=$G(VEPER7PT(9000011,TRACE_",",.03)),X=$P(X,"@"),%DT="T" D ^%DT .I Y'=VISITDT&DGREG'=1 Q ; FOR PATIENT REGISTRATION, PASS ALL PROBLEMS, FOR VISIT, PASS ONLY VISIT RELATED PROBLEMS .S SETID=SETID+1,DATE=Y D ..N REC ..S REC="" ..S $P(REC,"|")=SETID ..S $P(REC,"|",3)=$G(VEPER7PT("9000011",TRACE_",",.01))_"^"_$G(VEPER7PT("9000011",TRACE_",",.05))_"^I9" ; CODE^TEXT^SYSTEM ..S DATE=$P($$FMTHL7^XLFDT(DATE),"-") ..S $P(REC,"|",5)=DATE ; DIAGNOSIS DATE ..S $P(REC,"|",6)="F" ;Diagnosis Type - Final ..S $P(REC,"|",16)=PRIPHN ;Diagnosis Clinician ..W "DG1|"_REC ..W ! Q ; ; ZPT ;Practice Patients Topics segment data ; N REC S REC="" S $P(REC,"|",1)=CONFIG(19904.5,CFGIEN,.02) ;Primary Clinic Group Upin S $P(REC,"|",2)="MR" ;Patient ID List Code Sys ; ;***CBF*** Patient ID - need to find in IHS patient file ; S DOQPATID=$P(^AUPNPAT(PATDFN,41,DUZ(2),0),"^",2) S $P(REC,"|",3)=DOQPATID S $P(REC,"|",4)=TOPTYP ;Topic Type S $P(REC,"|",5)=TOPIND ;Topic Indicator S $P(REC,"|",6)=$E(ENEFFDT,1,8) ;Enrollment Effective Date S $P(REC,"|",7)=$E(ENCLSDT,1,8) ;Enrollment Close Date W "ZPT|"_REC W ! Q ; ; PID ; ; N REC S REC="" S $P(REC,"|",1)="1" ;Set ID ; ;***CBF*** Patient ID - need to find in IHS patient file ; S DOQPATID=$P(^AUPNPAT(PATDFN,41,DUZ(2),0),"^",2) S $P(REC,"|",3)=DOQPATID_"^^^^MR" W "PID|"_REC W ! Q ; ; PV1 ; ; N REC S REC="" S $P(REC,"|",2)="R" S $P(REC,"|",19)=VSTNO ;Visit Number S DTTM=$G(VISIT(9000010,VSTIEN,.01,"I")),DTTM=$P(DTTM,".") S $P(REC,"|",44)=$P($$FMTHL7^XLFDT(DTTM),"-") ;Admit Date/Time W "PV1|"_REC W ! Q ; ; ZL1 ; ; ;***CBF*** MODIFIED TO PASS ALLERGEN TYPE CODE AS AN ACTUAL CODE, RATHER THAN TEXT ; ALSO CHANGED ALLERGEN TO A CODE^TEXT^CODE SYSTEM (WHICH MUST BE SNOMED-2) ; BASED ON LEXICON SEARCH. THERE COULD ALSO BE MORE THAN ONE ALLERY, NEED ; TO FIND THEM ALL ; N PATDFN2,TRACE,DATE S TRACE="",PATDFN2=$P(DFN,","),SETID=0 F S TRACE=$O(^GMR(120.8,"B",PATDFN2,TRACE)) Q:'TRACE D . D GETS^DIQ(120.8,TRACE_",","**","","VEPER7PT") . S X=$G(VEPER7PT(120.8,TRACE_",",4)),X=$P(X,"@"),%DT="T" D ^%DT . I Y'=VISITDT&ALLREG'=1 Q ; FOR PATIENT REGISTRATION, PASS ALL ALLERGIES, FOR VISIT, PASS ONLY VISIT RELATED ALLERGIES . S SETID=SETID+1 D ..N REC,SEARCH,ALLIEN,LEX ..S REC="" ..S $P(REC,"|",1)=SETID ;Set ID ZL1 ..S TYPE=$G(VEPER7PT(120.8,TRACE_",",3.1)) ..S TYPE=$S(TYPE["FOOD":"FA",TYPE["DRUG":"DA",TYPE["POLLEN":"PA",TYPE["PLANT":"PA",TYPE["ANIMAL":"AA",TYPE["ENVIRON":"EA",1:"MA") ..S $P(REC,"|",2)=TYPE ;Allergen Type Code ..S SEARCH=$G(VEPER7PT(120.8,TRACE_",",1)) ..I SEARCH'="" S ALLIEN=$O(^LEX(757.01,"B",SEARCH,"")) I ALLIEN'="" D INFO^LEXA(ALLIEN) ..S $P(REC,"|",3)=$P($G(LEX("SEL","SRC","1")),"^",2)_"^"_SEARCH_"^SNM" ..S DATE=$P($$FMTHL7^XLFDT(Y),"-") ..S $P(REC,"|",6)=DATE ;Allergen Identification Date ..W "ZL1|"_REC ..W ! ..K LEX Q ; ; ORC ; ; N REC S REC="" S $P(REC,"|",1)="OK" S $P(REC,"|",2)=$S(ORCTYPE="PHARM":"P",1:"I")_TRACE ; PLACER ORDER NUMBER - UNIQUE ORDER NUMBER FOR ORDER S $P(REC,"|",12)=PRIPHN I ORCTYPE="IMMUNE" S X=$G(IMMUNE(9000010.11,TRACE_",",.03)),X=$P(X,"@"),%DT="T" D ^%DT I ORCTYPE="PHARM" S RXIEN=TRACE2_"," D GETS^DIQ(52,RXIEN,1,"I","MEDDATA") S Y=$G(MEDDATA(52,RXIEN,1,"I")) I Y="" S Y=VISITDT S $P(REC,"|",15)=$P($$FMTHL7^XLFDT(Y),"-") S $P(REC,"|",21)=FNMID W "ORC|"_REC W ! Q ; ; OBR ; ; ;***CBF*** FLESHED THIS OUT FOR FUTURE USE. VOE WON'T SEND OBR SEGMENTS, ; BUT MIGHT IN THE FUTURE. ; ;N REC S REC="" ;S $P(REC,"|",4)="" ; UNIVERSAL SERVICE IDENTIFIER - CODE^TEXT^CODE SYSTEM ;S $P(REC,"|",7)=DTTM ; OBSERVATION DATE TIME ;S $P(REC,"|",22)="" ; RESULTS REPORT ;S $P(REC,"|",)="" ;W "OBR|"_REC ;W ! Q Q ; ; RXO ; ; N RXIEN,REC,MEDDATA,DRUGIEN,DRUGAMT,DRUGDAY,DRUGREF,DRUGNDC,DRUGDATA,DRUGTEXT,DISPCODE S RXIEN=TRACE2_",",REC="" K MEDDATA D GETS^DIQ(52,RXIEN,"6;7;8;9;27;","I","MEDDATA") S DRUGIEN=$G(MEDDATA(52,RXIEN,6,"I"))_"," S DRUGAMT=$G(MEDDATA(52,RXIEN,7,"I")) S DRUGDAY=$G(MEDDATA(52,RXIEN,8,"I")) S DRUGREF=$G(MEDDATA(52,RXIEN,9,"I")) S DRUGNDC=$G(MEDDATA(52,RXIEN,27,"I")) K DRUGDATA D GETS^DIQ(50,DRUGIEN,".01","","DRUGDATA") S DRUGTEXT=$G(DRUGDATA(50,DRUGIEN,.01)) S DRUGNDC=$P(DRUGNDC,"-")_$P(DRUGNDC,"-",2)_$P(DRUGNDC,"-",3) S $P(REC,"|")=DRUGNDC_"^"_DRUGTEXT_"^NDC" ;DRUG INFORMATION = CODE^TEXT^CODE SYSTEM (always NDC) S $P(REC,"|",11)=DRUGAMT ;DISPENSE AMOUNT S $P(REC,"|",13)=DRUGREF ;NUMBER OF REFILLS S TOTQTY=DRUGAMT/DRUGDAY,TOTQTY=$E(TOTQTY,1,10) S $P(REC,"|",23)=TOTQTY ;TOTAL DAILY DOSAGE QUANTITY - QUANTITY/DAYS SUPPLY W "RXO|"_REC W ! Q ; ; RXA(RXAC) ; ; ; RXAC - RXA counter ; N REC,LEX,VOECODE S REC="" S RXAC=RXAC+1 S $P(REC,"|",1)=RXAC ;Give Sub ID Counter S $P(REC,"|",2)=RXAC ;Admin. Sub ID Counter S DTTM=$G(IMMUNE(9000010.11,DFN,.03)),DTTM=$P(DTTM,"@"),%DT="T",X=DTTM D ^%DT S DTTM=$P($$FMTHL7^XLFDT(Y),"-") S $P(REC,"|",3)=DTTM S $P(REC,"|",4)=DTTM S SEARCH=$G(IMMUNE(9000010.11,DFN,.01)) D INFO^LEXA(SEARCH) S VOECODE=$P($G(LEX("SEL","SRC",1)),"^",2) S VOECODE=$S(SEARCH["FLU":16,SEARCH["PNEUM":33,1:"") ; THIS NEEDS TO BE A "CVX" CODE FROM HL7TABLE 0292 S $P(REC,"|",5)=VOECODE_"^"_SEARCH_"^CVX" ; CODE^TEXT^CODE SYSTEM^"CVX" W "RXA|"_REC W ! Q ; ; BTS(MSHC) ;Batch Trailer Segment ; W "BTS|",MSHC,"|||||" W ! Q ; ; FTS(BTSC) ;File Trailer Segment ; W "FTS|",BHSC,"||" W ! Q ; ; DTCALC(DATE,TIME) ;CONVERT DATE INTO HL7 DATE FORMAT. ; I DATE="" S DATE="T" I TIME="" S TIME="N" N %DT,X,DTTM S %DT=DATE S X=TIME D ^%DT S DTTM=$P($$FMTHL7^XLFDT(Y),"-") Q DTTM ;