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

DGHTHL7.m

Go to the documentation of this file.
DGHTHL7 ;ALB/JAM - Home Telehealth Patient Sign-up HL7;10 January 2005 ; 9/25/07 10:18am
 ;;5.3;Registration;**644,1016**;Aug 13, 1993;Build 20
 ;
BLDHL7(DGHTH,MSG) ;Build HL7 Registration message for Home Telehealth
 ;Input : DGHTH - Arry with Home Telehealth transaction data
 ;        MSG   - Array to put message into (full global ref)
 ;Output: N  - Last line number used, or
 ;        0  - no message built, or
 ;        -1^ErrorText on error
 ;        MSG will contain HL7 message
 ;Note  : Insertion into MSG begins at next available line number
 ;
 N DFN,VENDOR,CONSULT,COORD,EVENTDT,VALCHK,DGX,ERR,PROTNAME,VAFPID
 N HLFS,HLECH,HLQ,HL,EVN,PID,PD1,PV1,LINE,X,Y
 S ERR=0,X="" F  S X=$O(DGHTH(X)) Q:X=""  D  I ERR Q
 .I DGHTH(X)="" S VALCHK="-1^Bad Input ("_X_")",ERR=1 Q
 .S @X=DGHTH(X)
 I ERR Q $G(VALCHK)
 I $G(MSG)="" Q "-1^Bad input variable (MSG)"
 S PROTNAME="DG HOME TELEHEALTH ADT-A04 SERVER"
 D INIT^HLFNC2(PROTNAME,.HL)
 I ($O(HL(""))="") Q "-1^Unable to initialize HL7 variables"
 S LINE=+$O(@MSG@(""),-1)
 ;
 ;EVN segment
 S EVN=$$EVN("A04","A04",EVENTDT)
 I $P(EVN,U)=-1 K @MSG Q EVN
 S LINE=LINE+1 S @MSG@(LINE)=EVN
 ;
 ;PID segment
 S PID=$$PID(DFN,.HL,.VAFPID)
 I $P(PID,U)=-1 Q PID
 D PIDVAL I ERR Q ERR
 S DGX=$O(VAFPID(0)),LINE=LINE+1 S @MSG@(LINE)=VAFPID(DGX)
 F  S DGX=$O(VAFPID(DGX)) Q:'DGX  D
 .S @MSG@(LINE,DGX-1)=VAFPID(DGX)
 ;
 ;PD1 segment
 S PD1=$$PD1(DFN,COORD)
 I $P(PD1,U)=-1 Q PD1
 S LINE=LINE+1 S @MSG@(LINE)=PD1
 ;
 ;PV1 segment
 S $P(PV1,HLFS,1)=1,$P(PV1,HLFS,5)=CONSULT
 S $P(PV1,HLFS,39)=$$STA^XUAF4(DUZ(2))
 S PV1="PV1"_HLFS_PV1
 S LINE=LINE+1 S @MSG@(LINE)=PV1
 ;
 Q LINE
 ;
EVN(TYPE,FLAG,DGEVDT) ;Build EVN segment
 ;Input:  TYPE   - HL7 event type
 ;        FLAG   - HL7 Event Reason Code
 ;        DGEVDT - Event Date/Time [Optional]
 ;Output: value  - EVN segment
 ;        -1^ErrorText on error
 ;
 N USRNAM,USERID,COMP,SUBCOMP,EVN
 I $G(TYPE)=""!($G(FLAG)="") Q "-1^Value missing to build message (EVN segment)"
 S EVN=$$EVN^VAFHLEVN(TYPE,FLAG,DGEVDT)
 I ($E(EVN,1,3)'="EVN") Q "-1^Error build message (EVN segment)"
 ;Add user and user's facility to EVN segment
 S COMP=$E(HL("ECH"),1),SUBCOMP=$E(HL("ECH"),4)
 S USRNAM=$$HLNAME^HLFNC($$GET1^DIQ(200,DUZ_",",.01),HL("ECH"))
 S USERID=DUZ_COMP_$P(USRNAM,COMP)_COMP_$P(USRNAM,COMP,2)_COMP_COMP_COMP
 S USERID=USERID_COMP_COMP_COMP_"USVHA"_SUBCOMP_SUBCOMP_"0363"_COMP_"L"
 S USERID=USERID_COMP_COMP_COMP_"NI"_COMP_"VA FACILITY ID"_SUBCOMP
 S USERID=USERID_$P($$SITE^VASITE,"^",3)_SUBCOMP_"L"
 S $P(EVN,HLFS,6)=USERID,$P(EVN,HLFS,8)=$P($$SITE^VASITE,HLFS,3)
 Q EVN
 ;
PID(DFN,HL,DGPID) ;Build PID segment
 ;Input:  DFN    - Patient DFN
 ;        HL     - HL7 values
 ;Output: DGPIR  - PID array segment
 ;            1  - PID segment build (no error)
 ;        -1^ErrorText on error
 ;
 N FLDS,DGX
 I $G(DFN)="" Q "-1^Value missing to build message (PID segment)"
 S FLDS=$$COMMANUM^VAFCADT2(1,9)_",10NTB,11,"
 S FLDS=FLDS_$$COMMANUM^VAFCADT2(12,21)_",22B"
 D BLDPID^VAFCQRY(DFN,"",FLDS,.DGPID,.HL)
 S DGX=$O(DGPID(0)) I DGX S DGX=DGPID(DGX)
 I $P(DGX,"^")'="PID" Q "-1^Error build message (PID segment)"
 Q 1
 ;
PD1(DFN,COORD) ;Build PD1 segment
 ;Input:  DFN    - Patient DFN
 ;        COOR   - Care Coordinator
 ;Output: PD1    - PD1 segment
 ;        -1^ErrorText on error
 ;
 N PD1,DGNAME
 I $G(DFN)=""!($G(COORD)="") Q "-1^Value missing to build message (PD1 segment)"
 S PD1=$$EN^VAFHLPD1(DFN,3)
 I ($E(PD1,1,3)'="PD1") Q "-1^Error build message (PD1 segment)"
 S DGNAME("FILE")=200,DGNAME("IENS")=COORD,DGNAME("FIELD")=.01
 S $P(PD1,HLFS,5)=COORD_$E(HLECH)_$$HLNAME^XLFNAME(.DGNAME,"",$E(HLECH))
 Q PD1
 ;
PIDVAL ;validate PID segment
 ;locate the fields in variable FLDS in VAFPID array, check its not null
 N NSTR,STR,FLN,FLDS,FLC,X,Y,Z
 S FLDS="4^6^8^12^20",(FLN,FLN(0))=0,DGX=0
 S STR="Patient Identifier list^Patient Name^Date of Birth^Patient address^SSN"
 F  S DGX=$O(VAFPID(DGX)) Q:'DGX  D  I ERR Q
 .S FLN(DGX)=$L(VAFPID(DGX),"^")-1,FLC=FLN,FLN=FLN+FLN(DGX)
 .F X=1:1 S Y=$P(FLDS,"^",X) Q:Y=""  I Y'="C" D  I ERR Q
 ..I Y'>FLN S $P(FLDS,"^",X)="C" D
 ...I FLN(DGX)=FLN S:($P(VAFPID(DGX),"^",Y-FLC)="")!($P(VAFPID(DGX),"^",Y-FLC)="""""") ERR="-1^Error in PID-"_(Y-1)_" field ("_$P(STR,"^",X)_")" Q
 ...S NSTR=$P(VAFPID(DGX-1),"^",FLN(DGX-1)+1)_VAFPID(DGX) I ($P(NSTR,"^",Y-FLC)="")!($P(NSTR,"^",Y-FLC)="""""") S ERR="-1^Error in PID-"_(Y-1)_" field ("_$P(STR,"^",X)_")" Q
 Q
 ;
BLDHL7I(DFN,MSG) ;Build HL7 Registration message for telehealth
 ;Input : DFN  - Pointer to PATIENT
 ;        MSG  - Array to put message into (full global ref)
 ;Output: Last line number used
 ;        -1^ErrorText on error
 ;        MSG will contain HL7 message
 ;Notes : Insertion into MSG begins at next available line number
 I '$D(^DPT(DFN,0)) Q "-1^Bad input (DFN)"
 I $G(MSG)="" Q "-1^Bad input variable (MSG)"
 N HLFS,HLECH,HLQ,HL,EVN,VAFPID,PV1,LINE,FLDS,DGVEN,DGX
 N EVNTDT,ERR,PROT4HL7,COMP,SUBCOMP,USRNAM,USERID
 S PROT4HL7="DG HOME TELEHEALTH ADT-A03 SERVER"
 D INIT^HLFNC2(PROT4HL7,.HL)
 I ($O(HL(""))="") Q "-1^Unable to initialize HL7 variables"
 S EVNTDT=$$NOW^XLFDT()
 S LINE=+$O(@MSG@(""),-1)
 ;EVN segment
 S EVN=$$EVN("A03","A03",EVNTDT)
 I EVN<0 K @MSG Q "-1^Error build message (EVN segment)"
 S LINE=LINE+1
 S @MSG@(LINE)=EVN
 ;
 ;PID segment
 N DGX
 S PID=$$PID(DGDFN,.HL,.VAFPID)
 I +PID'>0 S ERR=1 K @MSG Q "-1^Error build message (PID segment)"
 S DGX=$O(VAFPID(0)),LINE=LINE+1 S @MSG@(LINE)=VAFPID(DGX)
 F  S DGX=$O(VAFPID(DGX)) Q:'DGX  D
 .S @MSG@(LINE,DGX-1)=VAFPID(DGX)
 ;Done
 Q 1
SNDHL7(MSG,PTRRCV,PROTNAME)     ;Send HL7 Home Telehealth message to server
 ;Input : MSG - Array containing HL7 message to transmit
 ;              (full global reference)
 ;            - Must be in format required for interaction
 ;              with the HL7 package
 ;     PTRRCV  - Pointer for vendor receiving system
 ;    PROTNAME - Protocol name
 ;Output: Message ID
 ;        Message ID or 0^ErrorText on error
 ;Notes  : The global array ^TMP("HLS",$J) will be KILLed if MSG
 ;         does not use this global location
 I $G(MSG)="" Q "-1^Bad input variable(MSG)"
 I '$G(PTRRCV) Q "-1^Bad input variable for vendor (PTRRCV)"
 I ($O(@MSG@(""))="") Q "-1^Message empty... can't send empty"
 N DGARRAY,HL,HLL,HLFS,HLECH,HLQ,HLMTIEN,HLRESLT,HLP,KILLARRY,ARRY4HL7,APPINFO,DIC,CLPROT,SIEN,LINK
 S ARRY4HL7=$NA(^TMP("HLS",$J))
 D INIT^HLFNC2(PROTNAME,.HL)
 I ($O(HL(""))="") Q "-1^Unable to initialize HL7 variables"
 S APPINFO=$$APP4MSH(PTRRCV)
 I APPINFO="" Q "-1^Unable to determine receiving system information"
 ;See if MSG is ^TMP("HLS",$J)
 S KILLARRY=0
 I (MSG'=ARRY4HL7) D
 .;Make sure '$J' wasn't used
 .Q:(MSG="^TMP(""HLS"",$J)")
 .;Initialize ^TMP("HLS",$J) and merge XMITARRY into it
 .K @ARRY4HL7
 .M @ARRY4HL7=@MSG
 .S KILLARRY=1
 ;Using dynamic MSH segment
 S $P(HLP("SUBSCRIBER"),"^",2)="DG HOME TELEHEALTH"
 S $P(HLP("SUBSCRIBER"),"^",3)=$P(APPINFO,"^",1)
 S $P(HLP("SUBSCRIBER"),"^",4)="HTAPPL"
 S $P(HLP("SUBSCRIBER"),"^",5)=$P(APPINFO,"^",2)
 S HLP("PRIORITY")="I"  ;Immediate priority
 ;Get subscriber protocol
 S DIC="^ORD(101,",DIC(0)="B",X=PROTNAME D ^DIC
 D GETS^DIQ(101,+Y,"775*","E","ARRAY1")
 S CLPROT=ARRAY1(101.0775,$O(ARRAY1(101.0775,0)),.01,"E")
 ;Use inst file ien to retrieve logical link for dynamic addressing
 D LINK^HLUTIL3(DGVEN,.DGARRAY,"")
 S LINK=DGARRAY($O(DGARRAY(0)))
 S HLL("LINKS",1)=CLPROT_U_LINK
 D GENERATE^HLMA(PROTNAME,"GM",1,.HLRESLT,"",.HLP)
 ;S:('HLRESLT) HLRESLT=$P(HLRESLT,"^",2,3)
 ;Delete ^TMP("HLS",$J) if MSG was different
 K:(KILLARRY) @ARRY4HL7
 ;Done
 Q HLRESLT
 ;
APP4MSH(PTRRCV) ;Determine sending and receiving application for MSH segment
 ;Input : PTRRCV = Pointer to file #4 for receiving system
 ;Output: Sending Facility ^ Receiving Facility
 ;        Null = Error/bad input
 N SNDFAC,RCVFAC
 I 'PTRRCV Q ""
 I $$GET1^DIQ(4,PTRRCV,.01)="" Q ""
 S SNDFAC=$P($$SITE^VASITE(),"^",3)_$E(HLECH)
 S SNDFAC=SNDFAC_$$GET1^DIQ(4,$P($$SITE^VASITE(),"^"),60,"E")_$E(HLECH)
 S SNDFAC=SNDFAC_"DNS"
 S RCVFAC=$$GET1^DIQ(4,PTRRCV,99,"E")_$E(HLECH)
 S RCVFAC=RCVFAC_$$GET1^DIQ(4,PTRRCV,60,"E")_$E(HLECH)_"DNS"
 Q SNDFAC_"^"_RCVFAC