DGHTINAC ;ALB/JRC/JAM - Home Telehealth Patient Inactivation HL7;10 January 2005 ; 11/14/06 9:46am
;;5.3;PIMS;**1016**;JUN 30, 2012;Build 20
;;
EN ;Main entry point
;Initiate variables
N STOP,ARR,DGTYPE,DGDUZ,FLG
N CNT,DGDFN,DGVEN,NODE,NODE1,MSGTYPE,INACTDT,IRECORD,INODE,DGEVNT
N INAMSGID,ACKCODE,TINACTDT,DGVEN,DGCOOR,DGDATE,VENDOR,CHOICES
N ARECORD,NUMBER,TMPNODE,ITRANS,INODE,DGMID,RESULT,GETOK,DIR,RECORD
S ARR=$NA(HLA("HLS")),DGTYPE="I",DGDUZ=DUZ
S STOP=0
F D Q:STOP
.K ^TMP("DGHT",$J),CHOICES
.S (DGVEN,RECORD,CNT,FLG,ITRANS)=0
.W !!
.;Select patient
.S DGDFN=$$GETPAT()
.I 'DGDFN S STOP=1 Q
.;Get active patient's home telehealth records
.F S DGVEN=$O(^DGHT(391.31,"APATVN",DGDFN,DGVEN)) Q:'DGVEN D
..S ARECORD=$$LOCREC(DGDFN,DGVEN,"A")
..Q:'(ARECORD)
..;Get 0'th node of activation record and 0'th node of transaction
..S NODE=$G(^DGHT(391.31,$P(ARECORD,U,1),0))
..S NODE1=$G(^DGHT(391.31,+$P(ARECORD,U,1),"TRAN",+$P(ARECORD,U,2),0))
..Q:$P(NODE1,U,7)'="A"
..S IRECORD=$$LOCREC(DGDFN,DGVEN,"I")
..Q:'+IRECORD
..S MSGTYPE=$P($G(NODE1),U,4),INACTDT=$P($G(NODE),U,7)
..;Get Inactivation transaction node if exist
..S INODE=$G(^DGHT(391.31,+$P(IRECORD,U,1),"TRAN",+$P(IRECORD,U,2),0))
..S INAMSGID=$P(INODE,U,2),ACKCODE=$P(INODE,U,7),TINACTDT=$P(INODE,U,1)
..I $P($G(INODE),U,7)="A" Q
..;Increment counter
..S CNT=CNT+1
..;Store records in temporary global
..;
..; ^TMP NODE - Record # ^ Transaction # ^ patient ^ vendor ^
..; trans date ^ coordinator ^ trans type ^ inactiva
..; tio date ^ inact msg id ^ inact msg ack code ^
..; trans inactivation date and time ^ inact record
..;
..S DGVEN=$P(NODE,U,3),DGCOOR=$P(NODE,U,5),DGDATE=$P(NODE,U,6)
..S ^TMP("DGHT",$J,CNT,$P(ARECORD,U,1))=ARECORD_U_DGDFN_U_DGVEN_U_DGDATE_U_DGCOOR_U_MSGTYPE_U_INACTDT_U_$G(INAMSGID)_U_$G(ACKCODE)_U_$G(TINACTDT)_U_$TR(IRECORD,U,"~")
..;If more than one record prepare CHOICES variable for DIR call
..S VENDOR=$$GET1^DIQ(4,$P(NODE,U,3),.01,"E")
..S CHOICES=$G(CHOICES)_CNT_":"_$TR($$FMTE^XLFDT(DGDATE,"1HM"),":","")_" "_VENDOR_";"
..;If more than one active HTH record prompt user for selection
.I CNT>1 D Q:FLG
..;Resolve external value for PATIENT
..W !!,"Patient "_$$GET1^DIQ(2,DGDFN,.01,"E")_" has multiple active records"
..K DIR,X,Y,DIRUT,DUOUT
..S DIR(0)="S^"_CHOICES
..S DIR("A")="Select Sign-up/Activation record to Inactivate"
..D ^DIR
..I $D(DIRUT)!$D(DUOUT) S FLG=1 Q
..S NUMBER=Y
..S RECORD=0,RECORD=$O(^TMP("DGHT",$J,NUMBER,RECORD))
..S TMPNODE=^TMP("DGHT",$J,NUMBER,RECORD),IRECORD=$P(TMPNODE,U,12)
.;If there is only one record suppress choices
.I CNT=1 D
..S NUMBER=CNT
..S RECORD=0,RECORD=$O(^TMP("DGHT",$J,NUMBER,RECORD))
..S TMPNODE=^TMP("DGHT",$J,CNT,RECORD),IRECORD=$P(TMPNODE,U,12)
.;If no active records
.I 'CNT D Q:FLG
..W !
..W !,"************************************************************"
..W !,"* THIS PATIENT HAS NO ACTIVE HOME TELEHEALTH RECORDS *"
..W !,"************************************************************"
..S FLG=1
.;Display patient's record information to screen
.W @IOF
.W !!,"THE FOLLOWING PATIENT'S HOME TELEHEALTH RECORD WILL BE INACTIVATED"
.W !!
.D DSPREC^DGHTENR($P(TMPNODE,U,1,2))
.;If patient's record was previously inactivated display information
.I +$P(IRECORD,"~",2)'="" D
..W !,"Patient's inactivation was previously transmitted on:"
..W !!,?3,"Date & Time: ",?21,$$FMTE^XLFDT($P(TMPNODE,U,11),"2")
..W !,?3,"Message ID: ",?21,$P(TMPNODE,U,9)
..W !,?3,"Acknowledge Code: ",?21,$S($P(TMPNODE,U,10)="R":"Rejected",$P(TMPNODE,U,10)="A":"Accepted",1:"")
..W !!
.;Prompt user for inactivation date
.K DIR,X,Y,DIRUT,DUOUT
.S DIR(0)="D^::ERTXS"
.S DIR("A")="Enter Inactivation Date & Time"
.S DIR("B")=$$FMTE^XLFDT($$NOW^XLFDT())
.D ^DIR
.I $D(DIRUT)!$D(DUOUT) D EXIT Q
.S DGEVNT=Y
.;Get okay for tansmission
.S GETOK=$$SNDMSG^DGHTENR(DGTYPE)
.I 'GETOK W " ...Patient record not transmitted." D EXIT Q
.;Set variables and validate
.S DGVEN=$P(TMPNODE,U,4),DGDATE=$P(TMPNODE,U,5)
.S DGCOOR=$P(TMPNODE,U,6),TINACTDT=$P(TMPNODE,U,10)
.;build message
.W !!,"Generating message ..."
.K @ARR
.S RESULT=$$BLDHL7I^DGHTHL7(DGDFN,ARR)
.I RESULT<0 D Q
..W !,"** UNABLE TO BUILD MESSAGE **"
..W !,$P(RESULT,"^",2)
..K @ARR
.I RESULT=0 D Q
..W !,"** EMPTY MESSAGE BUILT **"
..K @ARR
.;send message
.W !,"Sending message ..."
.S RESULT=$$SNDHL7^DGHTHL7(ARR,DGVEN,"DG HOME TELEHEALTH ADT-A03 SERVER")
.I RESULT<0 D Q
..W !,"** UNABLE TO SEND MESSAGE **"
..W !,$P(RESULT,"^",2)
..K @ARR
.W !,"Sent using message ID ",+RESULT
.S DGMID=$P(RESULT,U,1)
.K @ARR
.D FILE
D EXIT
Q
;
GETPAT() ;Prompt user for patient
;Input : None
;Output: Pointer to PATIENT File, #2 (i.e. DFN)
; 0 on user quit
N DIC,X,Y,DTOUT,DUOUT
S DIC="^DPT(",DIC("A")="Patient: "
S DIC(0)="AEQM"
S DIC("S")="I $D(^DGHT(391.31,""APATVN"",+Y))"
D ^DIC
Q $S(+Y<0:0,1:+Y)
;
FILE ;Update Home Telehealth File Inactivation
N DGHFDA,DGHERR,FLDS,DA
;Remove old inactivation entry in transaction subfile
I +$P(IRECORD,"~",2) D
.N DIK S DA(1)=+$P(IRECORD,"~",1),DA=+$P(IRECORD,"~",2)
.S DIK="^DGHT(391.31,"_DA(1)_",""TRAN"","
.D ^DIK
;Update subfile 391.317 Transaction
K DGHFDA,DGHERR
S DGHFDA(391.317,"+2,"_RECORD_",",.01)=DGEVNT
S DGHFDA(391.317,"+2,"_RECORD_",",.02)=DGMID
S DGHFDA(391.317,"+2,"_RECORD_",",.03)=DGDUZ
S DGHFDA(391.317,"+2,"_RECORD_",",.04)=DGTYPE
D UPDATE^DIE("","DGHFDA","","DGHERR")
I $D(DGHERR) D
.W !!!,"Problem encountered during record update "
.W !!,"Contact IRM"_" Error: "_$G(DGHERR("DIERR",1,"TEXT",1))
Q
;
LOCREC(DFN,VENDOR,TYPE) ;Locate the appropriate record pointer(s) for processing
;Input : DFN - Patient DFN
; VENDOR - Vendor IEN
; TYPE - A for Activation/Sign-up or I for Inactivation
;Output: Record IEN^transaction IEN (if available)
; flag 1 = Patient record was located
; 0 = No record was located.
;
;If TYPE="A" and record has inactivation date then nothing will be
; returned, record is consider closed.
; TYPE="I" and transaction level record was accepted,then nothing
; will be returned, record is consider closed.
;
I ($G(DFN)="")!($G(VENDOR)="")!($G(TYPE)="") Q 0
N IEN,IEN1,DGDAT,DGDAT1,FND,FND1
S (IEN,FND,FND1)=0
F S IEN=$O(^DGHT(391.31,"APATVN",DFN,VENDOR,IEN)) Q:'IEN D I FND Q
.S DGDAT=$G(^DGHT(391.31,IEN,0)) I DGDAT="" Q
.Q:$P(DGDAT,"^",7)'=""
.;I TYPE="A" Q:$P(DGDAT,"^",7)'=""
.;I TYPE="I",$P(DGDAT,"^",7)="" S FND=IEN Q
.S IEN1=0 F S IEN1=$O(^DGHT(391.31,IEN,"TRAN",IEN1)) Q:'IEN1 D Q:+FND1
..S DGDAT1=$G(^DGHT(391.31,IEN,"TRAN",IEN1,0)) Q:DGDAT1=""
..I $P(DGDAT1,"^",4)'=$E(TYPE) Q
..I TYPE="I",$P(DGDAT1,"^",7)="A" Q
..S FND1=IEN1
.S FND=IEN_$S(IEN1:"^"_IEN1,1:"")
Q FND
;
EXIT ;Kill array
K ^TMP("DGHT",$J)
Q
DGHTINAC ;ALB/JRC/JAM - Home Telehealth Patient Inactivation HL7;10 January 2005 ; 11/14/06 9:46am
+1 ;;5.3;PIMS;**1016**;JUN 30, 2012;Build 20
+2 ;;
EN ;Main entry point
+1 ;Initiate variables
+2 NEW STOP,ARR,DGTYPE,DGDUZ,FLG
+3 NEW CNT,DGDFN,DGVEN,NODE,NODE1,MSGTYPE,INACTDT,IRECORD,INODE,DGEVNT
+4 NEW INAMSGID,ACKCODE,TINACTDT,DGVEN,DGCOOR,DGDATE,VENDOR,CHOICES
+5 NEW ARECORD,NUMBER,TMPNODE,ITRANS,INODE,DGMID,RESULT,GETOK,DIR,RECORD
+6 SET ARR=$NAME(HLA("HLS"))
SET DGTYPE="I"
SET DGDUZ=DUZ
+7 SET STOP=0
+8 FOR
Begin DoDot:1
+9 KILL ^TMP("DGHT",$JOB),CHOICES
+10 SET (DGVEN,RECORD,CNT,FLG,ITRANS)=0
+11 WRITE !!
+12 ;Select patient
+13 SET DGDFN=$$GETPAT()
+14 IF 'DGDFN
SET STOP=1
QUIT
+15 ;Get active patient's home telehealth records
+16 FOR
SET DGVEN=$ORDER(^DGHT(391.31,"APATVN",DGDFN,DGVEN))
IF 'DGVEN
QUIT
Begin DoDot:2
+17 SET ARECORD=$$LOCREC(DGDFN,DGVEN,"A")
+18 IF '(ARECORD)
QUIT
+19 ;Get 0'th node of activation record and 0'th node of transaction
+20 SET NODE=$GET(^DGHT(391.31,$PIECE(ARECORD,U,1),0))
+21 SET NODE1=$GET(^DGHT(391.31,+$PIECE(ARECORD,U,1),"TRAN",+$PIECE(ARECORD,U,2),0))
+22 IF $PIECE(NODE1,U,7)'="A"
QUIT
+23 SET IRECORD=$$LOCREC(DGDFN,DGVEN,"I")
+24 IF '+IRECORD
QUIT
+25 SET MSGTYPE=$PIECE($GET(NODE1),U,4)
SET INACTDT=$PIECE($GET(NODE),U,7)
+26 ;Get Inactivation transaction node if exist
+27 SET INODE=$GET(^DGHT(391.31,+$PIECE(IRECORD,U,1),"TRAN",+$PIECE(IRECORD,U,2),0))
+28 SET INAMSGID=$PIECE(INODE,U,2)
SET ACKCODE=$PIECE(INODE,U,7)
SET TINACTDT=$PIECE(INODE,U,1)
+29 IF $PIECE($GET(INODE),U,7)="A"
QUIT
+30 ;Increment counter
+31 SET CNT=CNT+1
+32 ;Store records in temporary global
+33 ;
+34 ; ^TMP NODE - Record # ^ Transaction # ^ patient ^ vendor ^
+35 ; trans date ^ coordinator ^ trans type ^ inactiva
+36 ; tio date ^ inact msg id ^ inact msg ack code ^
+37 ; trans inactivation date and time ^ inact record
+38 ;
+39 SET DGVEN=$PIECE(NODE,U,3)
SET DGCOOR=$PIECE(NODE,U,5)
SET DGDATE=$PIECE(NODE,U,6)
+40 SET ^TMP("DGHT",$JOB,CNT,$PIECE(ARECORD,U,1))=ARECORD_U_DGDFN_U_DGVEN_U_DGDATE_U_DGCOOR_U_MSGTYPE_U_INACTDT_U_$GET(INAMSGID)_U_$GET(ACKCODE)_U_$GET(TINACTDT)_U_$TRANSLATE(IRECORD,U,"~")
+41 ;If more than one record prepare CHOICES variable for DIR call
+42 SET VENDOR=$$GET1^DIQ(4,$PIECE(NODE,U,3),.01,"E")
+43 SET CHOICES=$GET(CHOICES)_CNT_":"_$TRANSLATE($$FMTE^XLFDT(DGDATE,"1HM"),":","")_" "_VENDOR_";"
+44 ;If more than one active HTH record prompt user for selection
End DoDot:2
+45 IF CNT>1
Begin DoDot:2
+46 ;Resolve external value for PATIENT
+47 WRITE !!,"Patient "_$$GET1^DIQ(2,DGDFN,.01,"E")_" has multiple active records"
+48 KILL DIR,X,Y,DIRUT,DUOUT
+49 SET DIR(0)="S^"_CHOICES
+50 SET DIR("A")="Select Sign-up/Activation record to Inactivate"
+51 DO ^DIR
+52 IF $DATA(DIRUT)!$DATA(DUOUT)
SET FLG=1
QUIT
+53 SET NUMBER=Y
+54 SET RECORD=0
SET RECORD=$ORDER(^TMP("DGHT",$JOB,NUMBER,RECORD))
+55 SET TMPNODE=^TMP("DGHT",$JOB,NUMBER,RECORD)
SET IRECORD=$PIECE(TMPNODE,U,12)
End DoDot:2
IF FLG
QUIT
+56 ;If there is only one record suppress choices
+57 IF CNT=1
Begin DoDot:2
+58 SET NUMBER=CNT
+59 SET RECORD=0
SET RECORD=$ORDER(^TMP("DGHT",$JOB,NUMBER,RECORD))
+60 SET TMPNODE=^TMP("DGHT",$JOB,CNT,RECORD)
SET IRECORD=$PIECE(TMPNODE,U,12)
End DoDot:2
+61 ;If no active records
+62 IF 'CNT
Begin DoDot:2
+63 WRITE !
+64 WRITE !,"************************************************************"
+65 WRITE !,"* THIS PATIENT HAS NO ACTIVE HOME TELEHEALTH RECORDS *"
+66 WRITE !,"************************************************************"
+67 SET FLG=1
End DoDot:2
IF FLG
QUIT
+68 ;Display patient's record information to screen
+69 WRITE @IOF
+70 WRITE !!,"THE FOLLOWING PATIENT'S HOME TELEHEALTH RECORD WILL BE INACTIVATED"
+71 WRITE !!
+72 DO DSPREC^DGHTENR($PIECE(TMPNODE,U,1,2))
+73 ;If patient's record was previously inactivated display information
+74 IF +$PIECE(IRECORD,"~",2)'=""
Begin DoDot:2
+75 WRITE !,"Patient's inactivation was previously transmitted on:"
+76 WRITE !!,?3,"Date & Time: ",?21,$$FMTE^XLFDT($PIECE(TMPNODE,U,11),"2")
+77 WRITE !,?3,"Message ID: ",?21,$PIECE(TMPNODE,U,9)
+78 WRITE !,?3,"Acknowledge Code: ",?21,$SELECT($PIECE(TMPNODE,U,10)="R":"Rejected",$PIECE(TMPNODE,U,10)="A":"Accepted",1:"")
+79 WRITE !!
End DoDot:2
+80 ;Prompt user for inactivation date
+81 KILL DIR,X,Y,DIRUT,DUOUT
+82 SET DIR(0)="D^::ERTXS"
+83 SET DIR("A")="Enter Inactivation Date & Time"
+84 SET DIR("B")=$$FMTE^XLFDT($$NOW^XLFDT())
+85 DO ^DIR
+86 IF $DATA(DIRUT)!$DATA(DUOUT)
DO EXIT
QUIT
+87 SET DGEVNT=Y
+88 ;Get okay for tansmission
+89 SET GETOK=$$SNDMSG^DGHTENR(DGTYPE)
+90 IF 'GETOK
WRITE " ...Patient record not transmitted."
DO EXIT
QUIT
+91 ;Set variables and validate
+92 SET DGVEN=$PIECE(TMPNODE,U,4)
SET DGDATE=$PIECE(TMPNODE,U,5)
+93 SET DGCOOR=$PIECE(TMPNODE,U,6)
SET TINACTDT=$PIECE(TMPNODE,U,10)
+94 ;build message
+95 WRITE !!,"Generating message ..."
+96 KILL @ARR
+97 SET RESULT=$$BLDHL7I^DGHTHL7(DGDFN,ARR)
+98 IF RESULT<0
Begin DoDot:2
+99 WRITE !,"** UNABLE TO BUILD MESSAGE **"
+100 WRITE !,$PIECE(RESULT,"^",2)
+101 KILL @ARR
End DoDot:2
QUIT
+102 IF RESULT=0
Begin DoDot:2
+103 WRITE !,"** EMPTY MESSAGE BUILT **"
+104 KILL @ARR
End DoDot:2
QUIT
+105 ;send message
+106 WRITE !,"Sending message ..."
+107 SET RESULT=$$SNDHL7^DGHTHL7(ARR,DGVEN,"DG HOME TELEHEALTH ADT-A03 SERVER")
+108 IF RESULT<0
Begin DoDot:2
+109 WRITE !,"** UNABLE TO SEND MESSAGE **"
+110 WRITE !,$PIECE(RESULT,"^",2)
+111 KILL @ARR
End DoDot:2
QUIT
+112 WRITE !,"Sent using message ID ",+RESULT
+113 SET DGMID=$PIECE(RESULT,U,1)
+114 KILL @ARR
+115 DO FILE
End DoDot:1
IF STOP
QUIT
+116 DO EXIT
+117 QUIT
+118 ;
GETPAT() ;Prompt user for patient
+1 ;Input : None
+2 ;Output: Pointer to PATIENT File, #2 (i.e. DFN)
+3 ; 0 on user quit
+4 NEW DIC,X,Y,DTOUT,DUOUT
+5 SET DIC="^DPT("
SET DIC("A")="Patient: "
+6 SET DIC(0)="AEQM"
+7 SET DIC("S")="I $D(^DGHT(391.31,""APATVN"",+Y))"
+8 DO ^DIC
+9 QUIT $SELECT(+Y<0:0,1:+Y)
+10 ;
FILE ;Update Home Telehealth File Inactivation
+1 NEW DGHFDA,DGHERR,FLDS,DA
+2 ;Remove old inactivation entry in transaction subfile
+3 IF +$PIECE(IRECORD,"~",2)
Begin DoDot:1
+4 NEW DIK
SET DA(1)=+$PIECE(IRECORD,"~",1)
SET DA=+$PIECE(IRECORD,"~",2)
+5 SET DIK="^DGHT(391.31,"_DA(1)_",""TRAN"","
+6 DO ^DIK
End DoDot:1
+7 ;Update subfile 391.317 Transaction
+8 KILL DGHFDA,DGHERR
+9 SET DGHFDA(391.317,"+2,"_RECORD_",",.01)=DGEVNT
+10 SET DGHFDA(391.317,"+2,"_RECORD_",",.02)=DGMID
+11 SET DGHFDA(391.317,"+2,"_RECORD_",",.03)=DGDUZ
+12 SET DGHFDA(391.317,"+2,"_RECORD_",",.04)=DGTYPE
+13 DO UPDATE^DIE("","DGHFDA","","DGHERR")
+14 IF $DATA(DGHERR)
Begin DoDot:1
+15 WRITE !!!,"Problem encountered during record update "
+16 WRITE !!,"Contact IRM"_" Error: "_$GET(DGHERR("DIERR",1,"TEXT",1))
End DoDot:1
+17 QUIT
+18 ;
LOCREC(DFN,VENDOR,TYPE) ;Locate the appropriate record pointer(s) for processing
+1 ;Input : DFN - Patient DFN
+2 ; VENDOR - Vendor IEN
+3 ; TYPE - A for Activation/Sign-up or I for Inactivation
+4 ;Output: Record IEN^transaction IEN (if available)
+5 ; flag 1 = Patient record was located
+6 ; 0 = No record was located.
+7 ;
+8 ;If TYPE="A" and record has inactivation date then nothing will be
+9 ; returned, record is consider closed.
+10 ; TYPE="I" and transaction level record was accepted,then nothing
+11 ; will be returned, record is consider closed.
+12 ;
+13 IF ($GET(DFN)="")!($GET(VENDOR)="")!($GET(TYPE)="")
QUIT 0
+14 NEW IEN,IEN1,DGDAT,DGDAT1,FND,FND1
+15 SET (IEN,FND,FND1)=0
+16 FOR
SET IEN=$ORDER(^DGHT(391.31,"APATVN",DFN,VENDOR,IEN))
IF 'IEN
QUIT
Begin DoDot:1
+17 SET DGDAT=$GET(^DGHT(391.31,IEN,0))
IF DGDAT=""
QUIT
+18 IF $PIECE(DGDAT,"^",7)'=""
QUIT
+19 ;I TYPE="A" Q:$P(DGDAT,"^",7)'=""
+20 ;I TYPE="I",$P(DGDAT,"^",7)="" S FND=IEN Q
+21 SET IEN1=0
FOR
SET IEN1=$ORDER(^DGHT(391.31,IEN,"TRAN",IEN1))
IF 'IEN1
QUIT
Begin DoDot:2
+22 SET DGDAT1=$GET(^DGHT(391.31,IEN,"TRAN",IEN1,0))
IF DGDAT1=""
QUIT
+23 IF $PIECE(DGDAT1,"^",4)'=$EXTRACT(TYPE)
QUIT
+24 IF TYPE="I"
IF $PIECE(DGDAT1,"^",7)="A"
QUIT
+25 SET FND1=IEN1
End DoDot:2
IF +FND1
QUIT
+26 SET FND=IEN_$SELECT(IEN1:"^"_IEN1,1:"")
End DoDot:1
IF FND
QUIT
+27 QUIT FND
+28 ;
EXIT ;Kill array
+1 KILL ^TMP("DGHT",$JOB)
+2 QUIT