- APCLSMU ;cmi/flag/maw - APCL MU2 MESSAGE GENERATOR 5/12/2010 9:26:17 AM
- ;;3.0;IHS PCC REPORTS;**29,30**;FEB 05, 1997;Build 27
- ;
- OPT ;EP - option to export via date range or patient
- N TYPE
- S TYPE=$$EXPTYP()
- Q:TYPE=""
- I TYPE="P" D PATEXP Q
- I TYPE="D" D DATEXP^APCLSMUN Q
- Q
- ;
- EXPTYP() ;-- get the export type
- S DIR(0)="S^P:One Patient's Visit;D:Date Range of Visits"
- S DIR("A")="Export Type"
- D ^DIR
- I $D(DIRUT) Q ""
- Q $G(Y)
- ;
- PATEXP ;-- ask the patient and visit date
- D GETPAT
- I APCDPAT="" W !!,"No PATIENT selected!" D EOJ Q
- D GETVISIT
- I APCDVSIT="" W !!,"No VISIT selected!" D EOJ Q
- F I="A04","A03","A08","A01" D MSG(I,APCDVSIT,APCDPAT)
- Q
- ;
- DATEXP ;-- ask the date range
- N BDT,EDT,DADA,DIEN,PAT
- S %DT="AE",%DT("A")="Begin Date: "
- D ^%DT
- I Y<0 D EOJ Q
- S BDT=+Y
- S %DT="AE",%DT("A")="End Date: "
- D ^%DT
- I Y<0 D EOJ Q
- S EDT=+Y
- S DADA=BDT-.0001 F S DADA=$O(^AUPNVSIT("B",DADA)) Q:DADA>(EDT+.9999)!'DADA D
- . S DIEN=0 F S DIEN=$O(^AUPNVSIT("B",DADA,DIEN)) Q:'DIEN D
- .. S PAT=$P($G(^AUPNVSIT(DIEN,0)),U,5)
- .. F I="A04","A03","A08","A01" D MSG(I,DIEN,PAT)
- Q
- ;
- GETPAT ;EP GET- PATIENT
- W !
- S AUPNLK("INAC")=""
- S APCDPAT=""
- S DIC("A")="Enter PATIENT NAME: ",DIC="^AUPNPAT(",DIC(0)="AEMQ" D ^DIC K DIC
- Q:Y<0
- S APCDPAT=+Y
- Q
- ;
- GETVISIT ;EP - this entry point called by the BVP package (View patient record)
- S APCDLOOK="",APCDVSIT=""
- K APCDVLK
- D ^APCDVLK
- K APCDLOOK
- Q
- ;
- MSG(EVN,VST,PAT) ;EP - create the message based on the event type and visit
- N VDATE,UNITFLG
- S VDATE=$P($$GET1^DIQ(9000010,VST,.01,"I"),".")
- S OBXCNT=0,DGCNT=0
- N LN,HL1,HRCN,FLD,LP,X,LN
- S LN=0
- S HLPM("MESSAGE TYPE")="ADT"
- S HLPM("EVENT")=EVN
- S HLPM("VERSION")="2.5.1"
- I '$$NEWMSG^HLOAPI(.HLPM,.HLST,.ERR) D Q
- .W !,"Unable to create message" Q
- S HLFS=HLPM("FIELD SEPARATOR")
- S HLECH=HLPM("ENCODING CHARACTERS")
- S HL1("ECH")=HLECH
- S HL1("FS")=HLFS
- S HL1("Q")=""
- S HL1("VER")=HLPM("VERSION")
- D MSH("ADT",EVN)
- D EVN(EVN)
- D PID(PAT)
- D PV1(EVN,VST,PAT)
- I EVN="A01" D PV2(VST,PAT)
- I (EVN="A03") D
- . S DGCNT=DGCNT+1
- . D DG1S(EVN,VST)
- S OBXCNT=OBXCNT+1
- D OBXLOC(VST,OBXCNT)
- S UNITFLG=0
- I $$GET1^DIQ(40.7,$P($G(^AUPNVSIT(VST,0)),U,8),1)=30,EVN="A04" D ;this may not work but we will see if they accept another OBX
- . ;Q:'$$GET1^DIQ(9000010,VST,1601)
- . Q:$P($G(^DPT(PAT,0)),U)'["UNKNOWN"
- . ;Q:$P($G(^DPT(PAT,0)),U,2)'="U" ;ihs/cmi/maw lets use this if they have an UNKNOWN sex
- . S OBXCNT=OBXCNT+1
- . S UNITFLG=1
- . D OBXUNIT(PAT,VST,OBXCNT)
- I '$G(UNITFLG) D
- . S OBXCNT=OBXCNT+1
- . D OBXAGE(PAT,VST,OBXCNT)
- S OBXCNT=OBXCNT+1
- D OBXCC(VST,OBXCNT)
- I EVN'="A03" D
- . ;D DG1P(EVN,VST,0)
- . Q:EVN="A01"
- . D DG1S(EVN,VST) ;for multiple DX in A08 and primary in A04
- S APPARMS("SENDING APPLICATION")="RPMS-ILI"
- S APPARMS("RECEIVING APPLICATION")="ILI"
- S APPARMS("ACCEPT ACK TYPE")="AL" ;Commit ACK type
- S APPARMS("APP ACK RESPONSE")="AACK^APCLSHL" ;Callback when 'application ACK' is received
- S APPARMS("ACCEPT ACK RESPONSE")="CACK^APCLSHL" ;Callback when 'commit ACK' is received
- S APPARMS("APP ACK TYPE")="AL" ;Application ACK type
- S APPARMS("QUEUE")="ILI ADT" ;Incoming QUEUE
- S WHO("RECEIVING APPLICATION")="ILI"
- S WHO("FACILITY LINK NAME")="IHS"
- S WHOTO("RECEIVING APPLICATION")="ILI"
- I '$$SENDONE^HLOAPI1(.HLST,.APPARMS,.WHO,.ERR) D
- . S ERR=$G(ERR)
- D GL(HLST("IEN"),EVN,PAT,VDATE)
- K OBXCNT
- Q
- ;
- SETHL(MTYPE,EVNTTYPE) ;-- setup HLO variables
- ;N HLPM,HLST,ARY,HLQ,APPARMS,HLPM,HLMSGIEN,HLECH,HLFS,ERR,WHO
- N LN,HL1,HRCN,FLD,LP,X,LN
- S LN=0
- S HLPM("MESSAGE TYPE")=MTYPE
- S HLPM("EVENT")=EVNTTYPE
- S HLPM("VERSION")="2.5.1"
- I '$$NEWMSG^HLOAPI(.HLPM,.HLST,.ERR) D Q
- .;D NOTIF(DFN,"Unable to build HL7 message."_$S($D(ERR):" ERR:"_$G(ERR),1:""))
- S HLFS=HLPM("FIELD SEPARATOR")
- S HLECH=HLPM("ENCODING CHARACTERS")
- S HL1("ECH")=HLECH
- S HL1("FS")=HLFS
- S HL1("Q")=""
- S HL1("VER")=HLPM("VERSION")
- Q
- ;
- ERR ;
- Q
- ;
- ; Create MSH segment
- MSH(MS,EV) ;EP
- N MSH,%,X,FLD,VAL
- D NOW^%DTC
- S X=$$HLDATE^HLFNC(%,"TS")
- D SET(.ARY,"NSH",0)
- D SET(.ARY,"RPMS",4,1)
- D SET(.ARY,"1231231234",4,2)
- D SET(.ARY,"NPI",4,3)
- D SET(.ARY,X,7)
- D SET(.ARY,MS,9,1)
- D SET(.ARY,EV,9,2)
- D SET(.ARY,MS_"_"_$S(EV="A04":"A01",EV="A08":"A01",1:EV),9,3)
- D SET(.ARY,"IHS-"_$R(999999999),10)
- D SET(.ARY,"P",11)
- D SET(.ARY,"2.5.1",12)
- D SET(.ARY,"PH_SS-NoAck",21,1)
- D SET(.ARY,"SS Sender",21,2)
- D SET(.ARY,"2.16.840.1.114222.4.10.3",21,3)
- D SET(.ARY,"ISO",21,4)
- S MSH=$$ADDSEG^HLOAPI(.HLST,.ARY)
- Q
- EVN(EVNTTYPE) ;Create the EVN segment
- N %,X,FLD,VAL
- D NOW^%DTC
- S X=$$HLDATE^HLFNC(%,"TS")
- D SET(.ARY,"EVN",0)
- D SET(.ARY,X,2)
- D SET(.ARY,"RPMS",7,1)
- D SET(.ARY,1231231234,7,2)
- D SET(.ARY,"NPI",7,3)
- S X=$$ADDSEG^HLOAPI(.HLST,.ARY,.ERR)
- Q
- ; Create PID segment
- PID(P) ;EP
- S HLQ=HL1("Q")
- N REC,SEX,RACEI,RACE,ZIP,CNTY,EDA,ETH,ETHI,NTYP,DOD,ADD,CITY,STI,STATE,ADD2,DOB
- S NTYP=$S($P($G(^DPT(P,0)),U)["UNKNOWN":"U",1:"S") ;this needs to be determined
- S REC=$$HRN^AUPNPAT(P,DUZ(2))
- S SEX=$P($G(^DPT(P,0)),U,2)
- S DOB=$$FMTHL7^XLFDT($$GET1^DIQ(2,P,.03,"I"))
- S RACEI=$P($G(^DPT(P,0)),U,6)
- I '$G(RACEI) S RACEI=$O(^DPT(P,.02,0))
- S RACE=$$GET1^DIQ(10,RACEI,4)
- S ADD=$$GET1^DIQ(2,P,.111)
- S ADD2=$$GET1^DIQ(2,P,.112)
- S CITY=$$GET1^DIQ(2,P,.114)
- S STI=$$GET1^DIQ(2,P,.115,"I")
- S STATE=$S(STI]"":$P($G(^DIC(5,STI,0)),U,3),1:"")
- S ZIP=$$GET1^DIQ(2,P,.116)
- S CNTY=$$GET1^DIQ(2,P,.117)
- I CNTY="" D
- . N COR,CTY
- . S COR=$$GET1^DIQ(9000001,P,1117,"I")
- . S CTY=$S(COR:$$GET1^DIQ(9999999.05,COR,.02,"I"),1:"")
- . I CTY S CNTY=$$GET1^DIQ(9999999.23,CTY,.04)
- S EDA=$O(^DPT(P,.06,"B",0))
- I EDA S ETHI=$P($G(^DPT(P,.06,EDA,0)),U)
- I $G(ETHI) S ETH=$$GET1^DIQ(10.2,ETHI,4)
- S DOD=$$GET1^DIQ(2,P,.351,"I")
- I DOD]"" S DOD=$$FMTHL7^XLFDT(DOD)
- D SET(.ARY,"PID",0)
- D SET(.ARY,1,1)
- D SET(.ARY,REC,3,1)
- D SET(.ARY,"MR",3,5) ; Patient HRN
- D SET(.ARY,$S(NTYP]"":NTYP,1:"S"),5,7,,2) ;this needs to be determined
- ;D SET(.ARY,DOB,7)
- D SET(.ARY,SEX,8)
- D SET(.ARY,RACE,10,1)
- I $G(RACE)]"" D SET(.ARY,"CDCREC",10,3)
- D SET(.ARY,ADD,11,1)
- D SET(.ARY,ADD2,11,2)
- D SET(.ARY,CITY,11,3)
- D SET(.ARY,STATE,11,4)
- D SET(.ARY,ZIP,11,5)
- D SET(.ARY,CNTY,11,9)
- D SET(.ARY,$G(ETH),22,1)
- I $G(ETH)]"" D SET(.ARY,"CDCREC",22,3)
- I EVN="A03" D
- . D SET(.ARY,DOD,29)
- . I DOD]"" D SET(.ARY,"Y",30)
- S X=$$ADDSEG^HLOAPI(.HLST,.ARY,.ERR)
- Q
- ;
- PV1(EV,V,P) ;-- setup the JVN PV1 segment
- D SET(.ARY,"PV1",0)
- D SET(.ARY,1,1)
- D SET(.ARY,V,19,1)
- D SET(.ARY,"VN",19,5)
- I EV="A03" D
- . N DDSP,VER
- . S DDSP="01"
- . I $$GET1^DIQ(2,P,.351,"I") S DDSP="20"
- . ;S VER=$O(^AUPNVER("AD",V,0))
- . S VER=$O(^AMERVSIT("AD",V,0))
- . I VER D
- .. N DED
- .. ;S DED=$P($G(^AUPNVER(VER,0)),U,11)
- .. S DED=$E($$GET1^DIQ(9009080,VER,6.1),1)
- .. S DDSP=$S(DED="A":"09",DED="D":20,DED="E":20,1:"01")
- . D SET(.ARY,DDSP,36)
- D SET(.ARY,$$FMTHL7^XLFDT($$GET1^DIQ(9000010,V,.01,"I")),44)
- S X=$$ADDSEG^HLOAPI(.HLST,.ARY,.ERR)
- Q
- ;
- PV2(V,PT) ;-- setup the PV2 segment
- ;this may need to be changed to look at the admitting dx in ADT
- Q:'$G(V)
- N HVST,VINP,DXI,DX,DXE,IVDT,ADMT
- ;find H visit here
- S IVDT=(9999999-$P(^AUPNVSIT(V,0),U))
- S EVDT=IVDT+2
- S HVST=$$FNDH(IVDT,EVDT,PT)
- Q:'HVST
- ;find the admit here and get admitting dx
- S ADMT=$O(^DGPM("AVST",PT,HVST,0))
- Q:'ADMT
- ;S VINP=$O(^AUPNVINP("AD",HVST,0))
- ;Q:'VINP
- ;S DXI=$$GET1^DIQ(9000010.02,VINP,.12,"I")
- ;S DX=$$GET1^DIQ(9000010.02,VINP,.12)
- S DXI=$O(^ICD9("AB",$P($G(^DGPM(ADMT,0)),U,10)_" ",0))
- S DX=$$GET1^DIQ(405,ADMT,.1,"I")
- I $G(DXI) S DXE=$$GET1^DIQ(80,DXI,3)
- N ICDT,ICDATA
- S ICDATA=$$ICDDX^APCLSILU(DX,VDATE)
- S ICDT=$P(ICDATA,U,20) ;get the icd type based on the code
- I $P(DX,".",2)="" S DX=$TR(DX,".")
- D SET(.ARY,"PV2",0)
- D SET(.ARY,DX,3,1)
- D SET(.ARY,$G(DXE),3,2)
- ;D SET(.ARY,"I9CDX",3,3)
- D SET(.ARY,$S(ICDT="30":"I10",1:"I9CDX"),3,3) ;p30
- S X=$$ADDSEG^HLOAPI(.HLST,.ARY,.ERR)
- Q
- ;
- FNDH(VDT,EDT,P) ;-- find the next H visit within 48 hours
- N VDA
- S VDA=VDT F S VDA=$O(^AUPNVSIT("AAH",P,VDA)) Q:'VDA D
- . S VIEN=0 F S VIEN=$O(^AUPNVSIT("AAH",P,VDA,VIEN)) Q:'VIEN D
- .. I VDA<EDT S VIN=VIEN Q
- Q $G(VIN)
- ;
- OBXLOC(V,CNT) ;-- setup the location OBX
- N CL,CLC,CD,DSC
- S CL=$P($G(^AUPNVSIT(V,0)),U,8)
- S CLC=$$GET1^DIQ(40.7,CL,1)
- S CD=""
- ;we will need to do a more dynamic clinic map here
- I CLC=80 S CD="261QU0200X" ;urgent care
- I CLC=30 S CD="261QE0002X" ;er
- Q:CD=""
- S DSC=$$LOOKTABM("","NUCC",CD,HLECH)
- D SET(.ARY,"OBX",0)
- D SET(.ARY,CNT,1)
- D SET(.ARY,"CWE",2)
- D SET(.ARY,"SS003",3,1) ;this may need to change as well
- D SET(.ARY,"PHINQUESTION",3,3)
- D SET(.ARY,CD,5,1)
- D SET(.ARY,$P(DSC,HLECH,2),5,2)
- D SET(.ARY,"NUCC",5,3)
- D SET(.ARY,"F",11)
- S X=$$ADDSEG^HLOAPI(.HLST,.ARY,.ERR)
- Q
- ;
- OBXUNIT(P,V,CNT) ;-- setup units
- Q:$P($G(^DPT(P,0)),U)'["UNKNOWN" ;this will need to change once we identify what an unknown patient is
- ;Q:$$GET1^DIQ(40.7,$P($G(^AUPNVSIT(V,0)),U,8),1)=80
- D SET(.ARY,"OBX",0)
- D SET(.ARY,CNT,1)
- D SET(.ARY,"NM",2)
- D SET(.ARY,"21612-7",3,1)
- D SET(.ARY,"LN",3,3)
- D SET(.ARY,"UNK",6,1)
- D SET(.ARY,"NULLFL",6,3)
- D SET(.ARY,"F",11)
- S X=$$ADDSEG^HLOAPI(.HLST,.ARY,.ERR)
- Q
- ;
- OBXAGE(P,V,CNT) ;-- setup the visit OBX
- ;Q:$$GET1^DIQ(40.7,$P($G(^AUPNVSIT(V,0)),U,8),1)=30
- N AGE
- S AGE=$$AGE^AUPNPAT(P)
- D SET(.ARY,"OBX",0)
- D SET(.ARY,CNT,1)
- D SET(.ARY,"NM",2)
- D SET(.ARY,"21612-7",3,1)
- D SET(.ARY,"LN",3,3)
- D SET(.ARY,AGE,5)
- D SET(.ARY,"a",6,1)
- D SET(.ARY,"UCUM",6,3)
- D SET(.ARY,"F",11)
- S X=$$ADDSEG^HLOAPI(.HLST,.ARY,.ERR)
- Q
- ;
- OBXCC(V,CNT) ;-- setup the chief complaint OBX
- N LN,CCI,CC,EC,ECE,ECI,VPOVI,CCE
- ;S VPOVI=$O(^AUPNVPOV("AD",V,0))
- ;S CCI=$$GET1^DIQ(9000010,V,1107,"I")
- ;S CC=$$GET1^DIQ(80,$$GET1^DIQ(9000010.07,VPOVI,.01,"I"),3)
- ;S LN=$$GET1^DIQ(9000010,V,1401)
- S CCE=$$GET1^DIQ(9000010,V,1401)
- Q:$G(CCE)=""
- I $G(CCE)]"" S CCI=$O(^ICD9("AB",CCE_" ",0))
- I $G(CCI) S CC=$$GET1^DIQ(80,CCI,3)
- ;S ECI=$$GET1^DIQ(9000010.07,VPOVI,.09,"I")
- S EC=$$GET1^DIQ(80,CCI,.01)
- S ECE=$$GET1^DIQ(80,CCI,3)
- D SET(.ARY,"OBX",0)
- D SET(.ARY,CNT,1)
- D SET(.ARY,"CWE",2)
- D SET(.ARY,"8661-1",3,1) ;this is the chief complaint loinc code
- I $G(CCI) D
- . D SET(.ARY,EC,5,1)
- . D SET(.ARY,ECE,5,2)
- . D SET(.ARY,"I9CDX",5,3)
- D SET(.ARY,"LN",3,3)
- D SET(.ARY,$G(CCE),5,9)
- D SET(.ARY,"F",11)
- S X=$$ADDSEG^HLOAPI(.HLST,.ARY,.ERR)
- Q
- ;
- DG1P(EV,V,FL) ;-- set the repeating DG1
- I 'FL Q:EV="A03"
- Q:EV="A01" ;IN pv2
- ;Q:EV'="A04"!EV'="A08"
- N DX,DXE,DXT
- S DXT=$S($G(FL):"F",1:"W")
- I EV="A08" S DXT="W"
- I EV="A04" S DXT="W"
- ;S DX=$TR($$PRIMPOV^APCLV(V,"C"),".")
- S DX=$$PRIMPOV^APCLV(V,"C")
- N ICDT,ICDATA
- S ICDATA=$$ICDDX^APCLSILU(DX,VDATE)
- S ICDT=$P(ICDATA,U,20) ;get the icd type based on the code
- I $P(DX,".",2)="" S DX=$TR(DX,".")
- ;S LEN=$L(DX)
- ;I $E(DX,LEN,LEN)="0" S DX=$E(DX,1,(LEN-1))
- Q:$G(DX)=""
- I $P(DX,".",2)="" S DX=$TR(DX,".")
- S DXE=$S(ICDT=30:$P(ICDATA,U,4),1:$P($$PRIMPOV^APCLV(V,"E"),"|"))
- D SET(.ARY,"DG1",0)
- D SET(.ARY,1,1)
- D SET(.ARY,DX,3,1)
- D SET(.ARY,DXE,3,2)
- D SET(.ARY,$S(ICDT="30":"I10",1:"I9CDX"),3,3) ;p30
- D SET(.ARY,DXT,6)
- S X=$$ADDSEG^HLOAPI(.HLST,.ARY,.ERR)
- Q
- ;
- DG1S(EV,V) ;-- set the secondary DXs
- N DX,DXE,DXT,DXDA,DXI,DXCNT,LEN,CNTR
- S DXCNT=0,CNTR=0
- S CNTR=$$POVS(V)
- I CNTR=1 D DG1P(EV,V,1) Q
- S DXDA=0 F S DXDA=$O(^AUPNVPOV("AD",V,DXDA)) Q:'DXDA D
- . ;Q:$P($G(^AUPNVPOV(DXDA,0)),U,12)="P"
- . S DXCNT=DXCNT+1
- . ;Q:DXCNT=1
- . S DXI=$P($G(^AUPNVPOV(DXDA,0)),U)
- . ;S DX=$TR($$GET1^DIQ(80,DXI,.01),".")
- . S DX=$$GET1^DIQ(80,DXI,.01)
- . N ICDT,ICDATA
- . S ICDATA=$$ICDDX^APCLSILU(DX,VDATE)
- . S ICDT=$P(ICDATA,U,20) ;get the icd type based on the code
- . I $P(DX,".",2)="" S DX=$TR(DX,".")
- . ;S LEN=$L(DX)
- . ;I $E(DX,LEN,LEN)="0" S DX=$E(DX,1,(LEN-1))
- . S DXE=$S(ICDT=30:$P(ICDATA,U,4),1:$$GET1^DIQ(80,DXI,3))
- . S DXT="F" ;change this once i know the formula
- . I EV="A08" S DXT="W"
- . I EV="A04" S DXT="W"
- . D SET(.ARY,"DG1",0)
- . D SET(.ARY,DXCNT,1)
- . ;D SET(.ARY,(DXCNT-1),1)
- . D SET(.ARY,DX,3,1)
- . D SET(.ARY,DXE,3,2)
- . D SET(.ARY,$S(ICDT="30":"I10",1:"I9CDX"),3,3)
- . D SET(.ARY,DXT,6)
- . S X=$$ADDSEG^HLOAPI(.HLST,.ARY,.ERR)
- Q
- ;
- POVS(V) ;-- count the POVs
- N DXDA,CN
- S CN=0
- S DXDA=0 F S DXDA=$O(^AUPNVPOV("AD",V,DXDA)) Q:'DXDA D
- . S CN=CN+1
- Q $G(CN)
- ;
- LOOKTABM(TYPE,TAB,VAL,ECH) ;-- find the value and description in the HL7 tables
- N DESC,IENI,GBL
- S GBL="^APCLMUT"
- I TYPE="" S GBL="^APCLMUT"
- S IENI=$O(@GBL@("AVAL",TAB,VAL,0))
- Q:'IENI
- S DESC=$P($G(@GBL@(IENI,0)),U,3)
- Q VAL_ECH_DESC_ECH_TYPE_TAB
- ;
- LOOKTAB(TYPE,TAB,VAL,ECH) ;-- find the value and description in the HL7 tables
- N DESC,IENI,GBL
- S GBL="^BHLTBL"
- I TYPE="" S GBL="^BHLOTBL"
- S IENI=$O(@GBL@("AVAL",TAB,VAL,0))
- Q:'IENI
- S DESC=$P($G(@GBL@(IENI,0)),U,3)
- Q VAL_ECH_DESC_ECH_TYPE_TAB
- ;
- LOOKDSC(TYPE,TAB,DSC,ECH) ;-- find a reverse value based on description
- N VAL,IENI,GBL
- S GBL="^BHLOTBL"
- I TYPE="" S GBL="^BHLOTBL"
- S IENI=$O(@GBL@("ADSC",TAB,DSC,0))
- Q:'IENI
- S VAL=$P($G(@GBL@(IENI,0)),U,2)
- Q VAL_ECH_ECH_TYPE_TAB
- ;
- SET(ARY,V,F,C,S,R) ;EP
- D SET^HLOAPI(.ARY,.V,.F,.C,.S,.R)
- Q
- ; Fix for non-working ZIPCODE Field trigger in File 2
- FIXZIP(DFN,ZIP) ;EP
- Q:$G(ZIP) ZIP
- Q $$GET1^DIQ(2,DFN,.116)
- ;
- HLD(FDT) ;-- convert to HL7 date
- I $G(FDT)="" Q ""
- N D
- S %DT="X"
- S X=FDT D ^%DT
- S D=$$FMTHL7^XLFDT(Y)
- Q D
- ;
- GL(IN,EV,PT,VDD) ;-- write out the batch to a global for saving in APCLSLAB
- K ^APCLTMP($J)
- N BDA,BDO,HLODAT,MSH,MSGP,MSG,BT,BT1,BT2,BT3
- S APCLCNT=0
- S MSG=$P($G(^HLB(IN,0)),U,2)
- D REST(MSG)
- D WRITE(EV,PT,VDD)
- Q
- ;
- REST(M) ;-- write out the remainder of the segments to the global
- N MDA,DATA,MCNT
- S MCNT=0
- S MDA=0 F S MDA=$O(^HLA(M,1,MDA)) Q:'MDA D
- . S DATA=$G(^HLA(M,1,MDA,0))
- . Q:DATA=""
- . I $E(DATA,1,3)="NSH" D
- .. S $E(DATA,1,4)="MSH"
- .. S $P(DATA,HLFS,2)="^~\&"
- . D SETGL(DATA)
- Q
- ;
- SETGL(D) ;-- set the temp global
- S APCLCNT=APCLCNT+1
- S ^APCLTMP($J,APCLCNT)=D
- Q
- ;
- WRITE(E,P,VD) ; use XBGSAVE to save the temp global (APCLDATA) to a delimited
- ; file that is exported to the IE system
- N XBGL,XBQ,XBQTO,XBNAR,XBMED,XBFLT,XBUF,XBFN,APCLFN
- S XBGL="APCLTMP",XBMED="F",XBQ="N",XBFLT=1,XBF=$J,XBE=$J
- S XBNAR="MU2 HL7 EXPORT"
- S APCLASU=$P($G(^AUTTLOC($P(^AUTTSITE(1,0),U),0)),U,10) ;asufac for file name
- S (XBFN,APCLDFN)="MU2_"_E_"_"_$$HRN^AUPNPAT(P,DUZ(2))_"_"_$$DATET(VD)_".txt"
- S XBS1="SURVEILLANCE MU2 SEND"
- ;
- D ^XBGSAVE
- ;
- I XBFLG'=0 D
- . I XBFLG(1)="" W:'$D(ZTQUEUED) !!,"MU2 HL7 file successfully created",!!
- . I XBFLG(1)]"" W:'$D(ZTQUEUED) !!,"MU2 HL7 file NOT successfully created",!!
- K ^APCLTMP($J),APCLCNT
- K ^APCLDATA($J)
- Q
- DATE(D) ;EP
- Q (1700+$E(D,1,3))_$E(D,4,5)_$E(D,6,7)
- ;
- DATET(D) ;EP
- Q (1700+$E(D,1,3))_$E(D,4,5)_$E(D,6,7)_$E(D,8,11)
- ;
- EOJ ; EP - EOJ HOUSE KEEPING - this ep called by the BVP package (View patient record)
- K AUPNLK("INAC")
- K %,%DT,%X,%Y,C,DIYS,X,Y
- K APCDCLN,APCDCAT,APCDDATE,APCDLOC,APCDPAT,APCDVSIT,APCDLOOK,APCDTYPE
- D KILL^AUPNPAT
- Q
- ;
- APCLSMU ;cmi/flag/maw - APCL MU2 MESSAGE GENERATOR 5/12/2010 9:26:17 AM
- +1 ;;3.0;IHS PCC REPORTS;**29,30**;FEB 05, 1997;Build 27
- +2 ;
- OPT ;EP - option to export via date range or patient
- +1 NEW TYPE
- +2 SET TYPE=$$EXPTYP()
- +3 IF TYPE=""
- QUIT
- +4 IF TYPE="P"
- DO PATEXP
- QUIT
- +5 IF TYPE="D"
- DO DATEXP^APCLSMUN
- QUIT
- +6 QUIT
- +7 ;
- EXPTYP() ;-- get the export type
- +1 SET DIR(0)="S^P:One Patient's Visit;D:Date Range of Visits"
- +2 SET DIR("A")="Export Type"
- +3 DO ^DIR
- +4 IF $DATA(DIRUT)
- QUIT ""
- +5 QUIT $GET(Y)
- +6 ;
- PATEXP ;-- ask the patient and visit date
- +1 DO GETPAT
- +2 IF APCDPAT=""
- WRITE !!,"No PATIENT selected!"
- DO EOJ
- QUIT
- +3 DO GETVISIT
- +4 IF APCDVSIT=""
- WRITE !!,"No VISIT selected!"
- DO EOJ
- QUIT
- +5 FOR I="A04","A03","A08","A01"
- DO MSG(I,APCDVSIT,APCDPAT)
- +6 QUIT
- +7 ;
- DATEXP ;-- ask the date range
- +1 NEW BDT,EDT,DADA,DIEN,PAT
- +2 SET %DT="AE"
- SET %DT("A")="Begin Date: "
- +3 DO ^%DT
- +4 IF Y<0
- DO EOJ
- QUIT
- +5 SET BDT=+Y
- +6 SET %DT="AE"
- SET %DT("A")="End Date: "
- +7 DO ^%DT
- +8 IF Y<0
- DO EOJ
- QUIT
- +9 SET EDT=+Y
- +10 SET DADA=BDT-.0001
- FOR
- SET DADA=$ORDER(^AUPNVSIT("B",DADA))
- IF DADA>(EDT+.9999)!'DADA
- QUIT
- Begin DoDot:1
- +11 SET DIEN=0
- FOR
- SET DIEN=$ORDER(^AUPNVSIT("B",DADA,DIEN))
- IF 'DIEN
- QUIT
- Begin DoDot:2
- +12 SET PAT=$PIECE($GET(^AUPNVSIT(DIEN,0)),U,5)
- +13 FOR I="A04","A03","A08","A01"
- DO MSG(I,DIEN,PAT)
- End DoDot:2
- End DoDot:1
- +14 QUIT
- +15 ;
- GETPAT ;EP GET- PATIENT
- +1 WRITE !
- +2 SET AUPNLK("INAC")=""
- +3 SET APCDPAT=""
- +4 SET DIC("A")="Enter PATIENT NAME: "
- SET DIC="^AUPNPAT("
- SET DIC(0)="AEMQ"
- DO ^DIC
- KILL DIC
- +5 IF Y<0
- QUIT
- +6 SET APCDPAT=+Y
- +7 QUIT
- +8 ;
- GETVISIT ;EP - this entry point called by the BVP package (View patient record)
- +1 SET APCDLOOK=""
- SET APCDVSIT=""
- +2 KILL APCDVLK
- +3 DO ^APCDVLK
- +4 KILL APCDLOOK
- +5 QUIT
- +6 ;
- MSG(EVN,VST,PAT) ;EP - create the message based on the event type and visit
- +1 NEW VDATE,UNITFLG
- +2 SET VDATE=$PIECE($$GET1^DIQ(9000010,VST,.01,"I"),".")
- +3 SET OBXCNT=0
- SET DGCNT=0
- +4 NEW LN,HL1,HRCN,FLD,LP,X,LN
- +5 SET LN=0
- +6 SET HLPM("MESSAGE TYPE")="ADT"
- +7 SET HLPM("EVENT")=EVN
- +8 SET HLPM("VERSION")="2.5.1"
- +9 IF '$$NEWMSG^HLOAPI(.HLPM,.HLST,.ERR)
- Begin DoDot:1
- +10 WRITE !,"Unable to create message"
- QUIT
- End DoDot:1
- QUIT
- +11 SET HLFS=HLPM("FIELD SEPARATOR")
- +12 SET HLECH=HLPM("ENCODING CHARACTERS")
- +13 SET HL1("ECH")=HLECH
- +14 SET HL1("FS")=HLFS
- +15 SET HL1("Q")=""
- +16 SET HL1("VER")=HLPM("VERSION")
- +17 DO MSH("ADT",EVN)
- +18 DO EVN(EVN)
- +19 DO PID(PAT)
- +20 DO PV1(EVN,VST,PAT)
- +21 IF EVN="A01"
- DO PV2(VST,PAT)
- +22 IF (EVN="A03")
- Begin DoDot:1
- +23 SET DGCNT=DGCNT+1
- +24 DO DG1S(EVN,VST)
- End DoDot:1
- +25 SET OBXCNT=OBXCNT+1
- +26 DO OBXLOC(VST,OBXCNT)
- +27 SET UNITFLG=0
- +28 ;this may not work but we will see if they accept another OBX
- IF $$GET1^DIQ(40.7,$PIECE($GET(^AUPNVSIT(VST,0)),U,8),1)=30
- IF EVN="A04"
- Begin DoDot:1
- +29 ;Q:'$$GET1^DIQ(9000010,VST,1601)
- +30 IF $PIECE($GET(^DPT(PAT,0)),U)'["UNKNOWN"
- QUIT
- +31 ;Q:$P($G(^DPT(PAT,0)),U,2)'="U" ;ihs/cmi/maw lets use this if they have an UNKNOWN sex
- +32 SET OBXCNT=OBXCNT+1
- +33 SET UNITFLG=1
- +34 DO OBXUNIT(PAT,VST,OBXCNT)
- End DoDot:1
- +35 IF '$GET(UNITFLG)
- Begin DoDot:1
- +36 SET OBXCNT=OBXCNT+1
- +37 DO OBXAGE(PAT,VST,OBXCNT)
- End DoDot:1
- +38 SET OBXCNT=OBXCNT+1
- +39 DO OBXCC(VST,OBXCNT)
- +40 IF EVN'="A03"
- Begin DoDot:1
- +41 ;D DG1P(EVN,VST,0)
- +42 IF EVN="A01"
- QUIT
- +43 ;for multiple DX in A08 and primary in A04
- DO DG1S(EVN,VST)
- End DoDot:1
- +44 SET APPARMS("SENDING APPLICATION")="RPMS-ILI"
- +45 SET APPARMS("RECEIVING APPLICATION")="ILI"
- +46 ;Commit ACK type
- SET APPARMS("ACCEPT ACK TYPE")="AL"
- +47 ;Callback when 'application ACK' is received
- SET APPARMS("APP ACK RESPONSE")="AACK^APCLSHL"
- +48 ;Callback when 'commit ACK' is received
- SET APPARMS("ACCEPT ACK RESPONSE")="CACK^APCLSHL"
- +49 ;Application ACK type
- SET APPARMS("APP ACK TYPE")="AL"
- +50 ;Incoming QUEUE
- SET APPARMS("QUEUE")="ILI ADT"
- +51 SET WHO("RECEIVING APPLICATION")="ILI"
- +52 SET WHO("FACILITY LINK NAME")="IHS"
- +53 SET WHOTO("RECEIVING APPLICATION")="ILI"
- +54 IF '$$SENDONE^HLOAPI1(.HLST,.APPARMS,.WHO,.ERR)
- Begin DoDot:1
- +55 SET ERR=$GET(ERR)
- End DoDot:1
- +56 DO GL(HLST("IEN"),EVN,PAT,VDATE)
- +57 KILL OBXCNT
- +58 QUIT
- +59 ;
- SETHL(MTYPE,EVNTTYPE) ;-- setup HLO variables
- +1 ;N HLPM,HLST,ARY,HLQ,APPARMS,HLPM,HLMSGIEN,HLECH,HLFS,ERR,WHO
- +2 NEW LN,HL1,HRCN,FLD,LP,X,LN
- +3 SET LN=0
- +4 SET HLPM("MESSAGE TYPE")=MTYPE
- +5 SET HLPM("EVENT")=EVNTTYPE
- +6 SET HLPM("VERSION")="2.5.1"
- +7 IF '$$NEWMSG^HLOAPI(.HLPM,.HLST,.ERR)
- Begin DoDot:1
- +8 ;D NOTIF(DFN,"Unable to build HL7 message."_$S($D(ERR):" ERR:"_$G(ERR),1:""))
- End DoDot:1
- QUIT
- +9 SET HLFS=HLPM("FIELD SEPARATOR")
- +10 SET HLECH=HLPM("ENCODING CHARACTERS")
- +11 SET HL1("ECH")=HLECH
- +12 SET HL1("FS")=HLFS
- +13 SET HL1("Q")=""
- +14 SET HL1("VER")=HLPM("VERSION")
- +15 QUIT
- +16 ;
- ERR ;
- +1 QUIT
- +2 ;
- +3 ; Create MSH segment
- MSH(MS,EV) ;EP
- +1 NEW MSH,%,X,FLD,VAL
- +2 DO NOW^%DTC
- +3 SET X=$$HLDATE^HLFNC(%,"TS")
- +4 DO SET(.ARY,"NSH",0)
- +5 DO SET(.ARY,"RPMS",4,1)
- +6 DO SET(.ARY,"1231231234",4,2)
- +7 DO SET(.ARY,"NPI",4,3)
- +8 DO SET(.ARY,X,7)
- +9 DO SET(.ARY,MS,9,1)
- +10 DO SET(.ARY,EV,9,2)
- +11 DO SET(.ARY,MS_"_"_$SELECT(EV="A04":"A01",EV="A08":"A01",1:EV),9,3)
- +12 DO SET(.ARY,"IHS-"_$RANDOM(999999999),10)
- +13 DO SET(.ARY,"P",11)
- +14 DO SET(.ARY,"2.5.1",12)
- +15 DO SET(.ARY,"PH_SS-NoAck",21,1)
- +16 DO SET(.ARY,"SS Sender",21,2)
- +17 DO SET(.ARY,"2.16.840.1.114222.4.10.3",21,3)
- +18 DO SET(.ARY,"ISO",21,4)
- +19 SET MSH=$$ADDSEG^HLOAPI(.HLST,.ARY)
- +20 QUIT
- EVN(EVNTTYPE) ;Create the EVN segment
- +1 NEW %,X,FLD,VAL
- +2 DO NOW^%DTC
- +3 SET X=$$HLDATE^HLFNC(%,"TS")
- +4 DO SET(.ARY,"EVN",0)
- +5 DO SET(.ARY,X,2)
- +6 DO SET(.ARY,"RPMS",7,1)
- +7 DO SET(.ARY,1231231234,7,2)
- +8 DO SET(.ARY,"NPI",7,3)
- +9 SET X=$$ADDSEG^HLOAPI(.HLST,.ARY,.ERR)
- +10 QUIT
- +11 ; Create PID segment
- PID(P) ;EP
- +1 SET HLQ=HL1("Q")
- +2 NEW REC,SEX,RACEI,RACE,ZIP,CNTY,EDA,ETH,ETHI,NTYP,DOD,ADD,CITY,STI,STATE,ADD2,DOB
- +3 ;this needs to be determined
- SET NTYP=$SELECT($PIECE($GET(^DPT(P,0)),U)["UNKNOWN":"U",1:"S")
- +4 SET REC=$$HRN^AUPNPAT(P,DUZ(2))
- +5 SET SEX=$PIECE($GET(^DPT(P,0)),U,2)
- +6 SET DOB=$$FMTHL7^XLFDT($$GET1^DIQ(2,P,.03,"I"))
- +7 SET RACEI=$PIECE($GET(^DPT(P,0)),U,6)
- +8 IF '$GET(RACEI)
- SET RACEI=$ORDER(^DPT(P,.02,0))
- +9 SET RACE=$$GET1^DIQ(10,RACEI,4)
- +10 SET ADD=$$GET1^DIQ(2,P,.111)
- +11 SET ADD2=$$GET1^DIQ(2,P,.112)
- +12 SET CITY=$$GET1^DIQ(2,P,.114)
- +13 SET STI=$$GET1^DIQ(2,P,.115,"I")
- +14 SET STATE=$SELECT(STI]"":$PIECE($GET(^DIC(5,STI,0)),U,3),1:"")
- +15 SET ZIP=$$GET1^DIQ(2,P,.116)
- +16 SET CNTY=$$GET1^DIQ(2,P,.117)
- +17 IF CNTY=""
- Begin DoDot:1
- +18 NEW COR,CTY
- +19 SET COR=$$GET1^DIQ(9000001,P,1117,"I")
- +20 SET CTY=$SELECT(COR:$$GET1^DIQ(9999999.05,COR,.02,"I"),1:"")
- +21 IF CTY
- SET CNTY=$$GET1^DIQ(9999999.23,CTY,.04)
- End DoDot:1
- +22 SET EDA=$ORDER(^DPT(P,.06,"B",0))
- +23 IF EDA
- SET ETHI=$PIECE($GET(^DPT(P,.06,EDA,0)),U)
- +24 IF $GET(ETHI)
- SET ETH=$$GET1^DIQ(10.2,ETHI,4)
- +25 SET DOD=$$GET1^DIQ(2,P,.351,"I")
- +26 IF DOD]""
- SET DOD=$$FMTHL7^XLFDT(DOD)
- +27 DO SET(.ARY,"PID",0)
- +28 DO SET(.ARY,1,1)
- +29 DO SET(.ARY,REC,3,1)
- +30 ; Patient HRN
- DO SET(.ARY,"MR",3,5)
- +31 ;this needs to be determined
- DO SET(.ARY,$SELECT(NTYP]"":NTYP,1:"S"),5,7,,2)
- +32 ;D SET(.ARY,DOB,7)
- +33 DO SET(.ARY,SEX,8)
- +34 DO SET(.ARY,RACE,10,1)
- +35 IF $GET(RACE)]""
- DO SET(.ARY,"CDCREC",10,3)
- +36 DO SET(.ARY,ADD,11,1)
- +37 DO SET(.ARY,ADD2,11,2)
- +38 DO SET(.ARY,CITY,11,3)
- +39 DO SET(.ARY,STATE,11,4)
- +40 DO SET(.ARY,ZIP,11,5)
- +41 DO SET(.ARY,CNTY,11,9)
- +42 DO SET(.ARY,$GET(ETH),22,1)
- +43 IF $GET(ETH)]""
- DO SET(.ARY,"CDCREC",22,3)
- +44 IF EVN="A03"
- Begin DoDot:1
- +45 DO SET(.ARY,DOD,29)
- +46 IF DOD]""
- DO SET(.ARY,"Y",30)
- End DoDot:1
- +47 SET X=$$ADDSEG^HLOAPI(.HLST,.ARY,.ERR)
- +48 QUIT
- +49 ;
- PV1(EV,V,P) ;-- setup the JVN PV1 segment
- +1 DO SET(.ARY,"PV1",0)
- +2 DO SET(.ARY,1,1)
- +3 DO SET(.ARY,V,19,1)
- +4 DO SET(.ARY,"VN",19,5)
- +5 IF EV="A03"
- Begin DoDot:1
- +6 NEW DDSP,VER
- +7 SET DDSP="01"
- +8 IF $$GET1^DIQ(2,P,.351,"I")
- SET DDSP="20"
- +9 ;S VER=$O(^AUPNVER("AD",V,0))
- +10 SET VER=$ORDER(^AMERVSIT("AD",V,0))
- +11 IF VER
- Begin DoDot:2
- +12 NEW DED
- +13 ;S DED=$P($G(^AUPNVER(VER,0)),U,11)
- +14 SET DED=$EXTRACT($$GET1^DIQ(9009080,VER,6.1),1)
- +15 SET DDSP=$SELECT(DED="A":"09",DED="D":20,DED="E":20,1:"01")
- End DoDot:2
- +16 DO SET(.ARY,DDSP,36)
- End DoDot:1
- +17 DO SET(.ARY,$$FMTHL7^XLFDT($$GET1^DIQ(9000010,V,.01,"I")),44)
- +18 SET X=$$ADDSEG^HLOAPI(.HLST,.ARY,.ERR)
- +19 QUIT
- +20 ;
- PV2(V,PT) ;-- setup the PV2 segment
- +1 ;this may need to be changed to look at the admitting dx in ADT
- +2 IF '$GET(V)
- QUIT
- +3 NEW HVST,VINP,DXI,DX,DXE,IVDT,ADMT
- +4 ;find H visit here
- +5 SET IVDT=(9999999-$PIECE(^AUPNVSIT(V,0),U))
- +6 SET EVDT=IVDT+2
- +7 SET HVST=$$FNDH(IVDT,EVDT,PT)
- +8 IF 'HVST
- QUIT
- +9 ;find the admit here and get admitting dx
- +10 SET ADMT=$ORDER(^DGPM("AVST",PT,HVST,0))
- +11 IF 'ADMT
- QUIT
- +12 ;S VINP=$O(^AUPNVINP("AD",HVST,0))
- +13 ;Q:'VINP
- +14 ;S DXI=$$GET1^DIQ(9000010.02,VINP,.12,"I")
- +15 ;S DX=$$GET1^DIQ(9000010.02,VINP,.12)
- +16 SET DXI=$ORDER(^ICD9("AB",$PIECE($GET(^DGPM(ADMT,0)),U,10)_" ",0))
- +17 SET DX=$$GET1^DIQ(405,ADMT,.1,"I")
- +18 IF $GET(DXI)
- SET DXE=$$GET1^DIQ(80,DXI,3)
- +19 NEW ICDT,ICDATA
- +20 SET ICDATA=$$ICDDX^APCLSILU(DX,VDATE)
- +21 ;get the icd type based on the code
- SET ICDT=$PIECE(ICDATA,U,20)
- +22 IF $PIECE(DX,".",2)=""
- SET DX=$TRANSLATE(DX,".")
- +23 DO SET(.ARY,"PV2",0)
- +24 DO SET(.ARY,DX,3,1)
- +25 DO SET(.ARY,$GET(DXE),3,2)
- +26 ;D SET(.ARY,"I9CDX",3,3)
- +27 ;p30
- DO SET(.ARY,$SELECT(ICDT="30":"I10",1:"I9CDX"),3,3)
- +28 SET X=$$ADDSEG^HLOAPI(.HLST,.ARY,.ERR)
- +29 QUIT
- +30 ;
- FNDH(VDT,EDT,P) ;-- find the next H visit within 48 hours
- +1 NEW VDA
- +2 SET VDA=VDT
- FOR
- SET VDA=$ORDER(^AUPNVSIT("AAH",P,VDA))
- IF 'VDA
- QUIT
- Begin DoDot:1
- +3 SET VIEN=0
- FOR
- SET VIEN=$ORDER(^AUPNVSIT("AAH",P,VDA,VIEN))
- IF 'VIEN
- QUIT
- Begin DoDot:2
- +4 IF VDA<EDT
- SET VIN=VIEN
- QUIT
- End DoDot:2
- End DoDot:1
- +5 QUIT $GET(VIN)
- +6 ;
- OBXLOC(V,CNT) ;-- setup the location OBX
- +1 NEW CL,CLC,CD,DSC
- +2 SET CL=$PIECE($GET(^AUPNVSIT(V,0)),U,8)
- +3 SET CLC=$$GET1^DIQ(40.7,CL,1)
- +4 SET CD=""
- +5 ;we will need to do a more dynamic clinic map here
- +6 ;urgent care
- IF CLC=80
- SET CD="261QU0200X"
- +7 ;er
- IF CLC=30
- SET CD="261QE0002X"
- +8 IF CD=""
- QUIT
- +9 SET DSC=$$LOOKTABM("","NUCC",CD,HLECH)
- +10 DO SET(.ARY,"OBX",0)
- +11 DO SET(.ARY,CNT,1)
- +12 DO SET(.ARY,"CWE",2)
- +13 ;this may need to change as well
- DO SET(.ARY,"SS003",3,1)
- +14 DO SET(.ARY,"PHINQUESTION",3,3)
- +15 DO SET(.ARY,CD,5,1)
- +16 DO SET(.ARY,$PIECE(DSC,HLECH,2),5,2)
- +17 DO SET(.ARY,"NUCC",5,3)
- +18 DO SET(.ARY,"F",11)
- +19 SET X=$$ADDSEG^HLOAPI(.HLST,.ARY,.ERR)
- +20 QUIT
- +21 ;
- OBXUNIT(P,V,CNT) ;-- setup units
- +1 ;this will need to change once we identify what an unknown patient is
- IF $PIECE($GET(^DPT(P,0)),U)'["UNKNOWN"
- QUIT
- +2 ;Q:$$GET1^DIQ(40.7,$P($G(^AUPNVSIT(V,0)),U,8),1)=80
- +3 DO SET(.ARY,"OBX",0)
- +4 DO SET(.ARY,CNT,1)
- +5 DO SET(.ARY,"NM",2)
- +6 DO SET(.ARY,"21612-7",3,1)
- +7 DO SET(.ARY,"LN",3,3)
- +8 DO SET(.ARY,"UNK",6,1)
- +9 DO SET(.ARY,"NULLFL",6,3)
- +10 DO SET(.ARY,"F",11)
- +11 SET X=$$ADDSEG^HLOAPI(.HLST,.ARY,.ERR)
- +12 QUIT
- +13 ;
- OBXAGE(P,V,CNT) ;-- setup the visit OBX
- +1 ;Q:$$GET1^DIQ(40.7,$P($G(^AUPNVSIT(V,0)),U,8),1)=30
- +2 NEW AGE
- +3 SET AGE=$$AGE^AUPNPAT(P)
- +4 DO SET(.ARY,"OBX",0)
- +5 DO SET(.ARY,CNT,1)
- +6 DO SET(.ARY,"NM",2)
- +7 DO SET(.ARY,"21612-7",3,1)
- +8 DO SET(.ARY,"LN",3,3)
- +9 DO SET(.ARY,AGE,5)
- +10 DO SET(.ARY,"a",6,1)
- +11 DO SET(.ARY,"UCUM",6,3)
- +12 DO SET(.ARY,"F",11)
- +13 SET X=$$ADDSEG^HLOAPI(.HLST,.ARY,.ERR)
- +14 QUIT
- +15 ;
- OBXCC(V,CNT) ;-- setup the chief complaint OBX
- +1 NEW LN,CCI,CC,EC,ECE,ECI,VPOVI,CCE
- +2 ;S VPOVI=$O(^AUPNVPOV("AD",V,0))
- +3 ;S CCI=$$GET1^DIQ(9000010,V,1107,"I")
- +4 ;S CC=$$GET1^DIQ(80,$$GET1^DIQ(9000010.07,VPOVI,.01,"I"),3)
- +5 ;S LN=$$GET1^DIQ(9000010,V,1401)
- +6 SET CCE=$$GET1^DIQ(9000010,V,1401)
- +7 IF $GET(CCE)=""
- QUIT
- +8 IF $GET(CCE)]""
- SET CCI=$ORDER(^ICD9("AB",CCE_" ",0))
- +9 IF $GET(CCI)
- SET CC=$$GET1^DIQ(80,CCI,3)
- +10 ;S ECI=$$GET1^DIQ(9000010.07,VPOVI,.09,"I")
- +11 SET EC=$$GET1^DIQ(80,CCI,.01)
- +12 SET ECE=$$GET1^DIQ(80,CCI,3)
- +13 DO SET(.ARY,"OBX",0)
- +14 DO SET(.ARY,CNT,1)
- +15 DO SET(.ARY,"CWE",2)
- +16 ;this is the chief complaint loinc code
- DO SET(.ARY,"8661-1",3,1)
- +17 IF $GET(CCI)
- Begin DoDot:1
- +18 DO SET(.ARY,EC,5,1)
- +19 DO SET(.ARY,ECE,5,2)
- +20 DO SET(.ARY,"I9CDX",5,3)
- End DoDot:1
- +21 DO SET(.ARY,"LN",3,3)
- +22 DO SET(.ARY,$GET(CCE),5,9)
- +23 DO SET(.ARY,"F",11)
- +24 SET X=$$ADDSEG^HLOAPI(.HLST,.ARY,.ERR)
- +25 QUIT
- +26 ;
- DG1P(EV,V,FL) ;-- set the repeating DG1
- +1 IF 'FL
- IF EV="A03"
- QUIT
- +2 ;IN pv2
- IF EV="A01"
- QUIT
- +3 ;Q:EV'="A04"!EV'="A08"
- +4 NEW DX,DXE,DXT
- +5 SET DXT=$SELECT($GET(FL):"F",1:"W")
- +6 IF EV="A08"
- SET DXT="W"
- +7 IF EV="A04"
- SET DXT="W"
- +8 ;S DX=$TR($$PRIMPOV^APCLV(V,"C"),".")
- +9 SET DX=$$PRIMPOV^APCLV(V,"C")
- +10 NEW ICDT,ICDATA
- +11 SET ICDATA=$$ICDDX^APCLSILU(DX,VDATE)
- +12 ;get the icd type based on the code
- SET ICDT=$PIECE(ICDATA,U,20)
- +13 IF $PIECE(DX,".",2)=""
- SET DX=$TRANSLATE(DX,".")
- +14 ;S LEN=$L(DX)
- +15 ;I $E(DX,LEN,LEN)="0" S DX=$E(DX,1,(LEN-1))
- +16 IF $GET(DX)=""
- QUIT
- +17 IF $PIECE(DX,".",2)=""
- SET DX=$TRANSLATE(DX,".")
- +18 SET DXE=$SELECT(ICDT=30:$PIECE(ICDATA,U,4),1:$PIECE($$PRIMPOV^APCLV(V,"E"),"|"))
- +19 DO SET(.ARY,"DG1",0)
- +20 DO SET(.ARY,1,1)
- +21 DO SET(.ARY,DX,3,1)
- +22 DO SET(.ARY,DXE,3,2)
- +23 ;p30
- DO SET(.ARY,$SELECT(ICDT="30":"I10",1:"I9CDX"),3,3)
- +24 DO SET(.ARY,DXT,6)
- +25 SET X=$$ADDSEG^HLOAPI(.HLST,.ARY,.ERR)
- +26 QUIT
- +27 ;
- DG1S(EV,V) ;-- set the secondary DXs
- +1 NEW DX,DXE,DXT,DXDA,DXI,DXCNT,LEN,CNTR
- +2 SET DXCNT=0
- SET CNTR=0
- +3 SET CNTR=$$POVS(V)
- +4 IF CNTR=1
- DO DG1P(EV,V,1)
- QUIT
- +5 SET DXDA=0
- FOR
- SET DXDA=$ORDER(^AUPNVPOV("AD",V,DXDA))
- IF 'DXDA
- QUIT
- Begin DoDot:1
- +6 ;Q:$P($G(^AUPNVPOV(DXDA,0)),U,12)="P"
- +7 SET DXCNT=DXCNT+1
- +8 ;Q:DXCNT=1
- +9 SET DXI=$PIECE($GET(^AUPNVPOV(DXDA,0)),U)
- +10 ;S DX=$TR($$GET1^DIQ(80,DXI,.01),".")
- +11 SET DX=$$GET1^DIQ(80,DXI,.01)
- +12 NEW ICDT,ICDATA
- +13 SET ICDATA=$$ICDDX^APCLSILU(DX,VDATE)
- +14 ;get the icd type based on the code
- SET ICDT=$PIECE(ICDATA,U,20)
- +15 IF $PIECE(DX,".",2)=""
- SET DX=$TRANSLATE(DX,".")
- +16 ;S LEN=$L(DX)
- +17 ;I $E(DX,LEN,LEN)="0" S DX=$E(DX,1,(LEN-1))
- +18 SET DXE=$SELECT(ICDT=30:$PIECE(ICDATA,U,4),1:$$GET1^DIQ(80,DXI,3))
- +19 ;change this once i know the formula
- SET DXT="F"
- +20 IF EV="A08"
- SET DXT="W"
- +21 IF EV="A04"
- SET DXT="W"
- +22 DO SET(.ARY,"DG1",0)
- +23 DO SET(.ARY,DXCNT,1)
- +24 ;D SET(.ARY,(DXCNT-1),1)
- +25 DO SET(.ARY,DX,3,1)
- +26 DO SET(.ARY,DXE,3,2)
- +27 DO SET(.ARY,$SELECT(ICDT="30":"I10",1:"I9CDX"),3,3)
- +28 DO SET(.ARY,DXT,6)
- +29 SET X=$$ADDSEG^HLOAPI(.HLST,.ARY,.ERR)
- End DoDot:1
- +30 QUIT
- +31 ;
- POVS(V) ;-- count the POVs
- +1 NEW DXDA,CN
- +2 SET CN=0
- +3 SET DXDA=0
- FOR
- SET DXDA=$ORDER(^AUPNVPOV("AD",V,DXDA))
- IF 'DXDA
- QUIT
- Begin DoDot:1
- +4 SET CN=CN+1
- End DoDot:1
- +5 QUIT $GET(CN)
- +6 ;
- LOOKTABM(TYPE,TAB,VAL,ECH) ;-- find the value and description in the HL7 tables
- +1 NEW DESC,IENI,GBL
- +2 SET GBL="^APCLMUT"
- +3 IF TYPE=""
- SET GBL="^APCLMUT"
- +4 SET IENI=$ORDER(@GBL@("AVAL",TAB,VAL,0))
- +5 IF 'IENI
- QUIT
- +6 SET DESC=$PIECE($GET(@GBL@(IENI,0)),U,3)
- +7 QUIT VAL_ECH_DESC_ECH_TYPE_TAB
- +8 ;
- LOOKTAB(TYPE,TAB,VAL,ECH) ;-- find the value and description in the HL7 tables
- +1 NEW DESC,IENI,GBL
- +2 SET GBL="^BHLTBL"
- +3 IF TYPE=""
- SET GBL="^BHLOTBL"
- +4 SET IENI=$ORDER(@GBL@("AVAL",TAB,VAL,0))
- +5 IF 'IENI
- QUIT
- +6 SET DESC=$PIECE($GET(@GBL@(IENI,0)),U,3)
- +7 QUIT VAL_ECH_DESC_ECH_TYPE_TAB
- +8 ;
- LOOKDSC(TYPE,TAB,DSC,ECH) ;-- find a reverse value based on description
- +1 NEW VAL,IENI,GBL
- +2 SET GBL="^BHLOTBL"
- +3 IF TYPE=""
- SET GBL="^BHLOTBL"
- +4 SET IENI=$ORDER(@GBL@("ADSC",TAB,DSC,0))
- +5 IF 'IENI
- QUIT
- +6 SET VAL=$PIECE($GET(@GBL@(IENI,0)),U,2)
- +7 QUIT VAL_ECH_ECH_TYPE_TAB
- +8 ;
- SET(ARY,V,F,C,S,R) ;EP
- +1 DO SET^HLOAPI(.ARY,.V,.F,.C,.S,.R)
- +2 QUIT
- +3 ; Fix for non-working ZIPCODE Field trigger in File 2
- FIXZIP(DFN,ZIP) ;EP
- +1 IF $GET(ZIP)
- QUIT ZIP
- +2 QUIT $$GET1^DIQ(2,DFN,.116)
- +3 ;
- HLD(FDT) ;-- convert to HL7 date
- +1 IF $GET(FDT)=""
- QUIT ""
- +2 NEW D
- +3 SET %DT="X"
- +4 SET X=FDT
- DO ^%DT
- +5 SET D=$$FMTHL7^XLFDT(Y)
- +6 QUIT D
- +7 ;
- GL(IN,EV,PT,VDD) ;-- write out the batch to a global for saving in APCLSLAB
- +1 KILL ^APCLTMP($JOB)
- +2 NEW BDA,BDO,HLODAT,MSH,MSGP,MSG,BT,BT1,BT2,BT3
- +3 SET APCLCNT=0
- +4 SET MSG=$PIECE($GET(^HLB(IN,0)),U,2)
- +5 DO REST(MSG)
- +6 DO WRITE(EV,PT,VDD)
- +7 QUIT
- +8 ;
- REST(M) ;-- write out the remainder of the segments to the global
- +1 NEW MDA,DATA,MCNT
- +2 SET MCNT=0
- +3 SET MDA=0
- FOR
- SET MDA=$ORDER(^HLA(M,1,MDA))
- IF 'MDA
- QUIT
- Begin DoDot:1
- +4 SET DATA=$GET(^HLA(M,1,MDA,0))
- +5 IF DATA=""
- QUIT
- +6 IF $EXTRACT(DATA,1,3)="NSH"
- Begin DoDot:2
- +7 SET $EXTRACT(DATA,1,4)="MSH"
- +8 SET $PIECE(DATA,HLFS,2)="^~\&"
- End DoDot:2
- +9 DO SETGL(DATA)
- End DoDot:1
- +10 QUIT
- +11 ;
- SETGL(D) ;-- set the temp global
- +1 SET APCLCNT=APCLCNT+1
- +2 SET ^APCLTMP($JOB,APCLCNT)=D
- +3 QUIT
- +4 ;
- WRITE(E,P,VD) ; use XBGSAVE to save the temp global (APCLDATA) to a delimited
- +1 ; file that is exported to the IE system
- +2 NEW XBGL,XBQ,XBQTO,XBNAR,XBMED,XBFLT,XBUF,XBFN,APCLFN
- +3 SET XBGL="APCLTMP"
- SET XBMED="F"
- SET XBQ="N"
- SET XBFLT=1
- SET XBF=$JOB
- SET XBE=$JOB
- +4 SET XBNAR="MU2 HL7 EXPORT"
- +5 ;asufac for file name
- SET APCLASU=$PIECE($GET(^AUTTLOC($PIECE(^AUTTSITE(1,0),U),0)),U,10)
- +6 SET (XBFN,APCLDFN)="MU2_"_E_"_"_$$HRN^AUPNPAT(P,DUZ(2))_"_"_$$DATET(VD)_".txt"
- +7 SET XBS1="SURVEILLANCE MU2 SEND"
- +8 ;
- +9 DO ^XBGSAVE
- +10 ;
- +11 IF XBFLG'=0
- Begin DoDot:1
- +12 IF XBFLG(1)=""
- IF '$DATA(ZTQUEUED)
- WRITE !!,"MU2 HL7 file successfully created",!!
- +13 IF XBFLG(1)]""
- IF '$DATA(ZTQUEUED)
- WRITE !!,"MU2 HL7 file NOT successfully created",!!
- End DoDot:1
- +14 KILL ^APCLTMP($JOB),APCLCNT
- +15 KILL ^APCLDATA($JOB)
- +16 QUIT
- DATE(D) ;EP
- +1 QUIT (1700+$EXTRACT(D,1,3))_$EXTRACT(D,4,5)_$EXTRACT(D,6,7)
- +2 ;
- DATET(D) ;EP
- +1 QUIT (1700+$EXTRACT(D,1,3))_$EXTRACT(D,4,5)_$EXTRACT(D,6,7)_$EXTRACT(D,8,11)
- +2 ;
- EOJ ; EP - EOJ HOUSE KEEPING - this ep called by the BVP package (View patient record)
- +1 KILL AUPNLK("INAC")
- +2 KILL %,%DT,%X,%Y,C,DIYS,X,Y
- +3 KILL APCDCLN,APCDCAT,APCDDATE,APCDLOC,APCDPAT,APCDVSIT,APCDLOOK,APCDTYPE
- +4 DO KILL^AUPNPAT
- +5 QUIT
- +6 ;