Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: BADEHL1

BADEHL1.m

Go to the documentation of this file.
  1. BADEHL1 ;IHS/MSC/MGH/PLS/VAC/AMF - Dentrix HL7 interface ;20-Feb-2013;fje
  1. ;;1.0;DENTAL/EDR INTERFACE;**1,2,3**;FEB 22, 2010;Build 4
  1. ;; Modified - IHS/MSC/AMF - 11/23/10 - More descriptive alert messages
  1. ;; Modified - IHS/MSC/VAC, IHS/SAIC/FJE, IHS/MSC/PLS,AMF - 9/10/10,1/3/11 - Fix for DUZ(2) problem
  1. ;; Modified - SAIC/FJE Patch 2 Sets LOCK for HLB,HLA,HLC globals, allows inactive patient messages to pass to DENTRIX after upload.
  1. ;; Modified - GDIT/DMB Patch 3 Remove LOCK for HLB,HLA,HLC globals based on new adapters
  1. Q
  1. ; Build Outbound A28 or A31 HL7 segments
  1. NEWMSG(DFN,EVNTTYPE) ;EP
  1. N HLPM,HLST,ARY,HLQ,APPARMS,HLPM,HLMSGIEN,HLECH,HLFS,ERR,WHO
  1. N LN,HL1,HRCN,FLD,LP,X,LN
  1. S LN=0
  1. S HLPM("MESSAGE TYPE")="ADT"
  1. S HLPM("EVENT")=EVNTTYPE
  1. S HLPM("VERSION")=2.4
  1. I '$$NEWMSG^HLOAPI(.HLPM,.HLST,.ERR) D Q
  1. .D NOTIF(DFN,"Unable to build HL7 message. "_$G(ERR)) ;IHS/MSC/AMF 11/23/10 More descriptive alert
  1. S HLFS=HLPM("FIELD SEPARATOR")
  1. S HLECH=HLPM("ENCODING CHARACTERS")
  1. S HL1("ECH")=HLECH
  1. S HL1("FS")=HLFS
  1. S HL1("Q")=""
  1. S HL1("VER")=HLPM("VERSION")
  1. ;Create segments
  1. ;
  1. D EVN(EVNTTYPE)
  1. I '$D(ERR) D PID(DFN)
  1. I '$D(ERR) D PD1(DFN)
  1. I '$D(ERR) D NK1
  1. I '$D(ERR) D INS^BADEHLI
  1. I '$D(ERR) D ZP2^BADEHLZ
  1. I '$D(ERR) D
  1. .; Define sending and receiving parameters
  1. .S APPARMS("SENDING APPLICATION")="RPMS-DEN"
  1. .S APPARMS("ACCEPT ACK TYPE")="AL" ;Commit ACK type
  1. .S APPARMS("APP ACK RESPONSE")="AACK^BADEHL1" ;Callback when 'application ACK' is received
  1. .S APPARMS("ACCEPT ACK RESPONSE")="CACK^BADEHL1" ;Callback when 'commit ACK' is received
  1. .S APPARMS("APP ACK TYPE")="AL" ;Application ACK type
  1. .S APPARMS("QUEUE")="DENT ADT" ;Incoming QUEUE
  1. .;S APPARMS("RECEIVING APPLICATION")="DENTRIX"
  1. .;S APPARMS("FACILITY LINK NAME")="DENTRIX"
  1. .;S APPARMS("FAILURE RESPONSE")="FAILURE^DENTHL1" ;Callback for transmission failures (i.e. - No 'commit ACK' received or message not sendable.
  1. .S WHO("RECEIVING APPLICATION")="DENTRIX"
  1. .S WHO("FACILITY LINK NAME")="DENTRIX"
  1. .;S WHO("STATION NUMBER")=11555 ;Used for testing on external RPMS system
  1. .; 06/06/2013 - DMB - TFS8008 - Remove extraneous locks on the HLO globals.
  1. .I '$$SENDONE^HLOAPI1(.HLST,.APPARMS,.WHO,.ERR) D
  1. ..D NOTIF(DFN,"Unable to send HL7 message. "_$G(ERR)) ;IHS/MSC/AMF 11/23/10 More descriptive alert
  1. Q
  1. ;
  1. AACK ; EP - Application ACK callback - called when AA, AE or AR is received.
  1. N DATA,AACK,XQAID,XQDATA,XQA,XQAMSG,MSGID
  1. Q:'$G(HLMSGIEN)
  1. S MSGID=$P($G(^HLB(+HLMSGIEN,0)),U)
  1. S AACK=$G(^HLB(HLMSGIEN,4))
  1. I $P(AACK,U,3)'["|AA|" D
  1. .S XQAMSG="EDR message "_MSGID_" did not receive a correct application ack."
  1. .S XQAID="ADEN,"_MSGID_","_50
  1. .S XQDATA=$P(AACK,U,3)
  1. .S XQA("G.RPMS DENTAL")=""
  1. .D SETUP^XQALERT
  1. Q
  1. ;
  1. CACK ; EP - Commit ACK callback - called when CA, CE or CR is received.
  1. N CACK,XQAID,XQAMSG,XQA,XQDATA,MSGID
  1. S MSGID=$P($G(^HLB(+HLMSGIEN,0)),U)
  1. S CACK=$G(^HLB(HLMSGIEN,4))
  1. I $P(CACK,U,3)'["|CA|" D
  1. .S XQAMSG="EDR message "_MSGID_" did not receive a correct commit acknowledgement."
  1. .S XQAID="ADEN,"_MSGID_","_50
  1. .S XQDATA=$P(CACK,U,3)
  1. .S XQA("G.RPMS DENTAL")=""
  1. .D SETUP^XQALERT
  1. Q
  1. ;
  1. ; Send Notification to group
  1. ; Input: DFN = Patient
  1. ; MSG = Main message
  1. NOTIF(DFN,MSG) ;EP ----- IHS/MSC/AMF 11/23/10 More descriptive alert
  1. N PVDIEN,RET,X,SAVE,STR,LEN
  1. N XQA,XQAID,XQADATA,XQAMSG
  1. S LEN=$L("Patient: ["_DFN_"]. "_$G(MSG))
  1. S STR=$P($G(^DPT(DFN,0)),U,1) I ($L(STR)+LEN)>70 S STR=$E(STR,1,(67-LEN))_"..."
  1. S XQAMSG="Patient: "_STR_" ["_DFN_"]. "_$G(MSG)
  1. ; ----- end IHS/MSC/AMF 11/23/10
  1. S XQAID="ADEN,"_DFN_","_50
  1. S XQDATA="DFN="_DFN
  1. S XQA("G.RPMS DENTAL")=""
  1. D SETUP^XQALERT
  1. ;Save the DFN in a parameter for correction
  1. S X=$$GET^XPAR("ALL","BADE EDR TOTAL ERRORS",1,"E")
  1. S X=X+1
  1. S SAVE=DFN_" "_MSG
  1. D EN^XPAR("SYS","BADE EDR ERROR PTS",X,SAVE)
  1. D EN^XPAR("SYS","BADE EDR TOTAL ERRORS",1,X)
  1. Q
  1. ;
  1. ERR ;
  1. Q
  1. ;
  1. EVN(EVNTTYPE) ;Create the EVN segment
  1. N %,X,FLD,VAL
  1. D NOW^%DTC
  1. S X=$$HLDATE^HLFNC(%,"TS")
  1. D SET(.ARY,"EVN",0)
  1. D SET(.ARY,EVNTTYPE,1)
  1. S FLD="ADT^"_EVNTTYPE
  1. F LP=1:1:$L(FLD,$E(HLECH)) S VAL=$P(FLD,$E(HLECH),LP) D
  1. .D SET(.ARY,VAL,5,LP)
  1. D SET(.ARY,X,2)
  1. D SET(.ARY,"01",4)
  1. S X=$$ADDSEG^HLOAPI(.HLST,.ARY,.ERR)
  1. I $D(ERR) D NOTIF($G(DFN),"Can't create EVN. "_ERR) ;IHS/MSC/AMF 11/23/10 More descriptive alert
  1. Q
  1. ; Create PID segment
  1. PID(DFN) ;EP
  1. N PID,HRCN,FLD,LP,VAL,ASU
  1. ;Q:'$G(DFN)
  1. I '$G(DFN) S ERR="PID ERROR" D NOTIF(DFN,"Can't create PID for: "_DFN) Q ;SAIC/FJE 08/04/2011
  1. ;Q:$G(^DPT(DFN,0))=""
  1. I $G(^DPT(DFN,0))="" S ERR="PID ERROR" D NOTIF(DFN,"Can't create PID for: "_DFN) Q ;SAIC/FJE 08/04/2011
  1. ;Q:$P($G(^DPT(DFN,0)),U,1)=""
  1. I $P($G(^DPT(DFN,0)),U,1)="" S ERR="PID ERROR" D NOTIF(DFN,"Can't create PID for: "_DFN) Q ;SAIC/FJE 08/04/2011
  1. N ASU,PID,SGM,X,LP,VAL,HLQ,MSTS
  1. S HLQ=HL1("Q")
  1. S PID=$$EN^VAFHLPID(DFN,"2,3,5,6,7,8,11,13,14,16,17,19,",1)
  1. ;Q:PID=""
  1. I PID="" S ERR="PID ERROR" D NOTIF(DFN,"Can't create PID for: "_DFN) Q ;SAIC/FJE 08/04/2011
  1. D SET(.ARY,"PID",0)
  1. D SET(.ARY,1,1)
  1. D SET(.ARY,DFN,2)
  1. ;IHS/MSC/PLS,AMF 1/3/11 Fix for DUZ problem
  1. ;S HRCN=$$HRCNF^BDGF2(DFN,DUZ(2))
  1. ;S HRCN=$$GETCHART(DFN,DUZ(2))
  1. S HRCN=$$FINDHRN(DFN,$S($G(AGDUZ2):AGDUZ2,1:DUZ(2)))
  1. ;end fix for DUZ problem
  1. S ASU=0
  1. S ASU=$$ASUFAC^BADEHL1(DFN)
  1. I ASU=0 I '$G(BADELOAD) S ERR="PID ERROR" D NOTIF(DFN,"No ASUFAC. Can't create PID.") Q ;SAIC/FJE 08/04/2011;IHS/MSC/AMF 11/23/10 More descriptive alert
  1. I HRCN="" S HRCN=$$HRN(DFN,$S($G(AGDUZ2):AGDUZ2,1:DUZ(2))) ;FJE 1/1/2013 Patch 02 If no active HRCN find first inactive to allow inactive patients to go to DENTRIX
  1. I '$G(BADELOAD) I '+HRCN S ERR="PID ERROR" D NOTIF(DFN,"No HRN. Can't create PID.") Q ;SAIC/FJE 08/04/2011;IHS/MSC/AMF 11/23/10 More descriptive alert
  1. D SET(.ARY,$P(HRCN,U),3,1) ; Patient HRN IHS/MSC/AMF 1/3/11 DUZ problem
  1. ;D SET(.ARY,"MR",3,5) ; Medical Record
  1. ;S ASU=$$ASUFAC^BADEHL1(DFN) ;Get all HRCNs for this patient
  1. S FLD=$P(PID,HLFS,6) ; Patient Name
  1. I FLD="" S ERR="PID ERROR" D NOTIF(DFN,"No name. Can't create PID.") Q ;SAIC/FJE 08/04/2011;IHS/MSC/AMF 11/23/10 More descriptive alert
  1. F LP=1:1:$L(FLD,$E(HLECH)) S VAL=$P(FLD,$E(HLECH),LP) D
  1. .D SET(.ARY,VAL,5,LP)
  1. D SET(.ARY,"L",5,7)
  1. D ALIAS(DFN)
  1. I $P(PID,HLFS,8)="" S ERR="PID ERROR" D NOTIF(DFN,"No Date of Birth. Can't create PID.") Q ;SAIC/FJE 08/04/2011;IHS/MSC/AMF 11/23/10 More descriptive alert
  1. S FLD=$$HLNAME^XLFNAME($$GET1^DIQ(2,DFN,.2403)) ; Mother's Maiden Name
  1. F LP=1:1:$L(FLD,$E(HLECH)) S VAL=$P(FLD,$E(HLECH),LP) D
  1. .D SET(.ARY,VAL,6,LP)
  1. D SET(.ARY,"M",6,7)
  1. D SET(.ARY,$P(PID,HLFS,8),7) ; Date of Birth
  1. D SET(.ARY,$P(PID,HLFS,9),8) ; Gender
  1. S FLD=$P(PID,HLFS,12) ; Patient Address
  1. F LP=1:1:$L(FLD,$E(HLECH)) S VAL=$P(FLD,$E(HLECH),LP) D
  1. .;Fix for zipcode
  1. .S:LP=5 VAL=$$FIXZIP(DFN,VAL)
  1. .D SET(.ARY,VAL,11,LP)
  1. I $L($P(PID,HLFS,14)) D
  1. .D SET(.ARY,$P(PID,HLFS,14),13) ; Patient Home Phone
  1. .D SET(.ARY,"PRN",13,2)
  1. .D SET(.ARY,"PH",13,3)
  1. I $L($P(PID,HLFS,15)) D
  1. .D SET(.ARY,$P(PID,HLFS,15),14) ; Patient Work Phone
  1. .D SET(.ARY,"WPH",14,2)
  1. .D SET(.ARY,"PH",14,3)
  1. ; PID-15 (Language) not captured in RPMS
  1. S MSTS=$$GET1^DIQ(2,DFN,.05,"I")
  1. D SET(.ARY,$$GET1^DIQ(11,MSTS,90001),16,1) ; Marital Status HL7 Code
  1. D SET(.ARY,$$GET1^DIQ(2,DFN,.05),16,2) ; Marital Status Text
  1. D SET(.ARY,$$GET1^DIQ(2,DFN,.08),17,2) ; Religion
  1. ; PID-18 (Patient Account #) not captured in RPMS
  1. D SET(.ARY,$P(PID,HLFS,20),19) ; Patient SSN
  1. D SET(.ARY,$$HLDATE^HLFNC($$GET1^DIQ(2,DFN,.351,"I"),"TS"),29) ; Patient Date of Death
  1. S X=$$ADDSEG^HLOAPI(.HLST,.ARY,.ERR)
  1. I $D(ERR) D NOTIF(DFN,"Can't create PID. "_ERR) ;IHS/MSC/AMF 11/23/10 More descriptive alert
  1. Q
  1. ;Add Aliases to segment
  1. ALIAS(DFN) ;EP
  1. N AL,FLD,LP,ALN,CNT
  1. ;Q:'$G(DFN)
  1. I '$G(DFN) S ERR="ALAIS ERROR" D NOTIF(DFN,"Can't create PID for: "_DFN) Q ;SAIC/FJE 08/04/2011
  1. S CNT=2
  1. S AL=0 F S AL=$O(^DPT(DFN,.01,AL)) Q:'AL D
  1. .S ALN=$P(^DPT(DFN,.01,AL,0),U)
  1. .S FLD=$$HLNAME^HLFNC(ALN)
  1. .F LP=1:1:$L(FLD,$E(HLECH)) S VAL=$P(FLD,$E(HLECH),LP) D
  1. ..D SET(.ARY,VAL,5,LP,1,CNT)
  1. .D SET(.ARY,"A",5,7,1,CNT)
  1. .S CNT=CNT+1
  1. Q
  1. ; Create Primary Provider segment
  1. PD1(DFN) ;EP
  1. ;Q:'$G(DFN)
  1. I '$G(DFN) S ERR="PID ERROR" D NOTIF(DFN,"Can't create PID for: "_DFN) Q ;SAIC/FJE 08/04/2011
  1. N PPRV,FLD,LP,PD1
  1. D SET(.ARY,"PD1",0)
  1. S PPRV=$$GET1^DIQ(9000001,DFN,.14,"I")
  1. S FLD=PPRV_$E(HLECH)_$$HLNAME^HLFNC($$GET1^DIQ(9000001,DFN,.14))
  1. F LP=1:1:$L(FLD,$E(HLECH)) S VAL=$P(FLD,$E(HLECH),LP) D
  1. .D SET(.ARY,VAL,4,LP)
  1. S PD1=$$ADDSEG^HLOAPI(.HLST,.ARY,.ERR)
  1. I $D(ERR) D NOTIF(DFN,"Can't create PD1. "_ERR) ;IHS/MSC/AMF 11/23/10 More descriptive alert
  1. Q
  1. ; Create next of kin and emergency contact segment
  1. NK1 ;EP
  1. N ADDR,NK1,NODE,PHONE,DGNAME,FLD,K,CNT,SHIP,REL,HLQ
  1. S CNT=0
  1. S HLQ=HL1("Q")
  1. F K="EC","NOK" D
  1. .I K="EC" S NODE=$G(^DPT(DFN,.33))
  1. .I K="NOK" S NODE=$G(^DPT(DFN,.21))
  1. .Q:NODE=""
  1. .S CNT=CNT+1
  1. .D SET(.ARY,"NK1",0)
  1. .D SET(.ARY,CNT,1)
  1. .S DGNAME("FILE")=2,DGNAME("IENS")=DFN
  1. .S DGNAME("FIELD")=$S(K="NOK":.211,K="EC":.331)
  1. .;Name of next of kin
  1. .S FLD=$$HLNAME^XLFNAME(.DGNAME,"","^")
  1. .F LP=1:1:$L(FLD,$E(HLECH)) S VAL=$P(FLD,$E(HLECH),LP) D
  1. ..D SET(.ARY,VAL,2,LP)
  1. .;Relationship
  1. .S SHIP=$S(K="EC":$P($G(^AUPNPAT(DFN,31)),U,2),K="NOK":$P($G(^AUPNPAT(DFN,28)),U,2))
  1. .I SHIP'="" D
  1. ..S X=$P($G(^AUTTRLSH(SHIP,0)),U,2)_"^"_$P($G(^AUTTRLSH(SHIP,0)),U,1)_"^UB-92"
  1. ..F LP=1:1:$L(X,$E(HLECH)) S VAL=$P(X,$E(HLECH),LP) D
  1. ...D SET(.ARY,VAL,3,LP)
  1. .S ADDR=$$ADDR^VAFHLFNC($P(NODE,U,3,8))
  1. .F LP=1:1:$L(ADDR,$E(HLECH)) S VAL=$P(ADDR,$E(HLECH),LP) D
  1. ..D SET(.ARY,VAL,4,LP) ;Address
  1. .S PHONE=$$HLPHONE^HLFNC($P(NODE,U,9))
  1. .I $L(PHONE) D
  1. ..D SET(.ARY,PHONE,5) ;Home phone
  1. ..D SET(.ARY,"PRN",5,2)
  1. ..D SET(.ARY,"PH",5,3)
  1. .S PHONE=$$HLPHONE^HLFNC($P(NODE,U,11))
  1. .I $L(PHONE) D
  1. ..D SET(.ARY,PHONE,6) ;Work phone
  1. ..D SET(.ARY,"WPH",6,2)
  1. ..D SET(.ARY,"PH",6,3)
  1. .D SET(.ARY,K,7)
  1. .D SET(.ARY,$S(K="EC":"Emergency Contact",K="NOK":"Next of Kin",1:""),7,2)
  1. .S NK1=$$ADDSEG^HLOAPI(.HLST,.ARY,.ERR)
  1. .I $D(ERR) D NOTIF(DFN,"Can't create NK1. "_ERR) ;IHS/MSC/AMF 11/23/10 More descriptive alert
  1. Q
  1. ASUFAC(DFN) ;Set up all the ASUFAC numbers for this patient
  1. N IEN,DATA,LOC,HRN,DATE,ASUFAC,FAC,LP,VAL,REP,PART
  1. S IEN=0,FAC=""
  1. F S IEN=$O(^AUPNPAT(DFN,41,IEN)) Q:'IEN D
  1. .S DATA=$G(^AUPNPAT(DFN,41,IEN,0))
  1. .S LOC=$P(DATA,U,1),DATE=$$HLDATE^HLFNC($P(DATA,U,3))
  1. .S ASUFAC=$$GETCHART(DFN,LOC)
  1. .I FAC="" S FAC=ASUFAC_"^"_DATE
  1. .E S FAC=FAC_"~"_ASUFAC_"^"_DATE
  1. I FAC="" Q 0
  1. F REP=1:1:$L(FAC,$E(HLECH,2,2)) S PART=$P(FAC,$E(HLECH,2,2),REP) D
  1. .F LP=1:1:$L(PART,$E(HLECH)) S VAL=$P(PART,$E(HLECH),LP) D
  1. ..D SET(.ARY,VAL,4,LP,,REP)
  1. ..D SET(.ARY,"ASUFAC",4,LP+1,,REP)
  1. Q 1
  1. GETCHART(P,L) ;
  1. N S,C,%
  1. ; ----- IHS/SAIC/FJE 11/5/2010
  1. S (X,LL)=0 F S X=$O(^AUPNPAT(P,41,X)) Q:+X=0!(LL=L) D
  1. .S Y=$G(^AUPNPAT(P,41,X,0))
  1. .Q:$L($P(Y,"^",3))
  1. .Q:'$L($P(Y,"^",2))
  1. .S LL=$P(Y,"^",1)
  1. I +LL I LL'=L S L=LL
  1. K LL,X,Y
  1. ; ----- end IHS/SAIC/FJE 11/5/2010
  1. S S=$P(^AUTTLOC(L,0),U,10)
  1. I S="" Q S
  1. S S=$E("000000",1,6-$L(S))_S
  1. S C=$P($G(^AUPNPAT(P,41,L,0)),U,2)
  1. I C="" Q C
  1. S C=$E("000000",1,6-$L(C))_C
  1. S %=S_C
  1. Q %
  1. ; Create MSA segment
  1. ; ----- IHS/MSC/PLS,AMF 1/3/2011
  1. FINDHRN(PAT,LOC) ;DD
  1. N L,RET,X
  1. S RET=""
  1. S X=$G(^AUPNPAT(PAT,41,LOC,0))
  1. I $L($P(X,U,2)),'$P(X,U,3) S RET=$$FMTHRN(LOC,$P(X,U,2))
  1. I RET="" D
  1. .S L=0 F S L=$O(^AUPNPAT(PAT,41,L)) Q:'L D Q:$L(RET)
  1. ..S X=$G(^AUPNPAT(PAT,41,L,0))
  1. ..Q:$P(X,U,3) ;Inactivated entry
  1. ..Q:'$L($P(X,U,2)) ;No HRN
  1. ..S RET=$$FMTHRN(L,$P(X,U,2))_U_-1_U_LOC
  1. Q RET
  1. ;
  1. HRN(PAT,LOC) ;;FJE 1/1/2013 Patch 02 Finds an HRCN active or inactive
  1. N L,RETHRN,X
  1. S RETHRN=""
  1. S X=$G(^AUPNPAT(PAT,41,LOC,0))
  1. I $L($P(X,U,2)) S RETHRN=$$FMTHRN(LOC,$P(X,U,2))
  1. I RETHRN="" D
  1. .S L=0 F S L=$O(^AUPNPAT(PAT,41,L)) Q:'L D Q:$L(RETHRN)
  1. ..S X=$G(^AUPNPAT(PAT,41,L,0))
  1. ..Q:'$L($P(X,U,2)) ;No HRN
  1. ..S RETHRN=$$FMTHRN(L,$P(X,U,2))_U_-1_U_LOC
  1. Q RETHRN
  1. ;
  1. FMTHRN(L,HRN) ;
  1. N S
  1. S S=$P(^AUTTLOC(L,0),U,10)
  1. I S="" Q S
  1. S S=$E("000000",1,6-$L(S))_S
  1. Q:'$L(HRN) HRN
  1. S HRN=$E("000000",1,6-$L(HRN))_HRN
  1. Q S_HRN
  1. MSA ;EP
  1. N MSA
  1. D SET(.ARY,"MSA",0)
  1. D SET(.ARY,"AA",1)
  1. D SET(.ARY,"TODO-MSGID",2)
  1. D SET(.ARY,"Transaction Successful",3)
  1. D SET(.ARY,"todo-010",4)
  1. S MSA=$$ADDSEG^HLOAPI(.HLST,.ARY)
  1. Q
  1. ; Create MSH segment
  1. ;EP
  1. N MSH
  1. D SET(.ARY,"MSH",0)
  1. S MSH=$$ADDSEG^HLOAPI(.HLST,.ARY)
  1. Q
  1. SET(ARY,V,F,C,S,R) ;EP
  1. D SET^HLOAPI(.ARY,.V,.F,.C,.S,.R)
  1. Q
  1. ; Fix for non-working ZIPCODE Field trigger in File 2
  1. FIXZIP(DFN,ZIP) ;EP
  1. Q:$G(ZIP) ZIP
  1. Q $$GET1^DIQ(2,DFN,.116)