BTIUMED2 ; IHS/MSC/MGH - Active/Recent Med Objects Routine ;12-Dec-2013 16:03;DU
;;1.0;TEXT INTEGRATION UTILITIES;**1006,1007,1009,1010,1011,1012,1013**;Jun 20, 1997;Build 33
;Patch 1011 changed to use new pharmacy APIS
Q
LIST(DFN,TARGET,CLININC) ; EP
;
; This is the TIU Medication object for medication reconciliation .
;
;Required Parameters:
;
; DFN Patient identifier
;
; TARGET Where the medication data will be stored
;
;Optional Parameters:
;
; CLININC 1=Clinical Indication will be included
;
N NEXTLINE,EMPTY,INDEX,NODE,ISINP,KEEPMED,STATUS,OK,RXNO,CHRONIC,LDATE,CANDATE,EXDATE,DETAILED
N INPTYPE,OUTPTYPE,TYPE,MEDTYPE,CNT,DATA,DATA1,MED,IDATE,XSTR,LLEN,DAYS,ACTVONLY,ONELIST
N LASTMEDT,LASTSTS,COUNT,TOTAL,SPACE60,DASH73,TEMP,LINE,TAB,HEADER,CLASSORT
N IFN,DRUGCLAS,DRUGIDX,LASTCLAS,OLDTAB,OLDHEADR,UNKNOWNS,LSTINDIC,SUPPLIES,AUTO
N NVATYPE,NVAMED,NVASTR,TIUXSTAT,CLIN,HIEN,IEN,REASON,REFILLS,COUNTER,EVENT
N %,%H,STOP,LSTFD ;Clean up after external calls...
S (NEXTLINE,TAB,HEADER,UNKNOWNS)=0,LLEN=47
K @TARGET,^TMP("PS",$J)
; Check for Pharmacy Package and required patches
I '$$PATCHSOK^TIULMED3 G LISTX ;P213
I $G(CLININC)'=1 S CLININC=0
S (EMPTY,HEADER)=1
S HEADER=1
S ISINP=($G(^DPT(DFN,.1))'="") ; Is this an inpatient?
S OUTPTYPE=1,INPTYPE=2,NVATYPE=3
;
; *** Scan medication data and skip unwanted meds ***
;
S DAYS=180,ACTVONLY=0,ONELIST=0,DETAILED=1
D OCL^PSOORRL(DFN,$$FMADD^XLFDT(DT,-DAYS),"")
S INDEX=0,CLASSORT=0,SUPPLIES=0
F S INDEX=$O(^TMP("PS",$J,INDEX)) Q:INDEX'>0 D
.S CHRONIC="",AUTO=0
.S NODE=$G(^TMP("PS",$J,INDEX,0))
.S KEEPMED=($L($P(NODE,U,2))>0) ;Discard Blank Meds
.;Group meds by status
.S STATUS=$P(NODE,U,9)
.I STATUS="ACTIVE/SUSP" S STATUS="ACTIVE (S)"
.S IDATE=$P(NODE,U,15)
.I $P(NODE,U)["R;O" D
..S RXNO=+($P(NODE,U,1))
..S AUTO=$P($G(^PSRX(RXNO,999999921)),U,3)
.S TYPE=$P($P(NODE,U),";",2)
.S TYPE=$S(TYPE="O":"OP",TYPE="I":"UD",1:"")
.S NVAMED=$P($P(NODE,U),";")
.S NVAMED=$E(NVAMED,$L(NVAMED))
.I NVAMED="N" D
..S IFN=+$P(NODE,U,8)
..S STATUS=$$NVSTS^BEHORXFN(IFN,$P(NODE,U,9))
..S $P(NODE,U,9)=STATUS
.I STATUS="EXPIRED" D
..I $P($P(NODE,U),";",2)["O" D
...S RXNO=+($P(NODE,U,1))
...S CHRONIC=$P($G(^PSRX(RXNO,9999999)),U,2)
...N X,X1,X2
...I CHRONIC S X1=DT,X2=-120 D C^%DTC S LDATE=X
...E S X1=DT,X2=-14 D C^%DTC S LDATE=X
...S EXDATE=$P($G(^PSRX(RXNO,2)),U,6)
...I EXDATE<LDATE S KEEPMED=0
..I $P($P(NODE,U),";",2)["I" D
...S EXDATE=$P(NODE,U,4)
...S X1=DT,X2=-14 D C^%DTC S LDATE=X
...I EXDATE<LDATE S KEEPMED=0
.I STATUS["DISCONTINUED" D
..I TYPE="OP" D
...I NVAMED="N" S KEEPMED=0 Q
...S X1=DT,X2=-30 D C^%DTC S LDATE=X
...S CANDATE=$P($G(^PSRX(RXNO,3)),U,5)
...I CANDATE<LDATE S KEEPMED=0
..I TYPE="UD" D
...S X1=DT,X2=-2 D C^%DTC S LDATE=X
...S CANDATE=$P(NODE,U,4)
...I CANDATE<LDATE S KEEPMED=0
..I STATUS="DISCONTINUED/EDIT"!(STATUS="DISCONTINUED (EDIT)") S KEEPMED=0
.I STATUS="PENDING" D
..S IEN=+($P(NODE,U))
..I IEN>0 S REFILLS=$P($G(^PS(52.41,IEN,0)),U,11)
..S $P(^TMP("PS",$J,INDEX,0),U,5)=REFILLS
.I $P($P(NODE,U),";")["N" D
..I STATUS="HOLD"!(STATUS["TRANSFER") S STATUS=STATUS
..E S STATUS="ACTIVE"
.I TYPE="" S KEEPMED=0
.I KEEPMED D
..I $O(^TMP("PS",$J,INDEX,"A",0))>0 S TYPE="IV"
..E I $O(^TMP("PS",$J,INDEX,"B",0))>0 S TYPE="IV"
..I TYPE="OP" S MEDTYPE=OUTPTYPE
..E S MEDTYPE=INPTYPE
..I NVAMED="N" S MEDTYPE=NVATYPE
..;I MEDTYPE=INPTYPE S KEEPMED=ISINP
..;E S KEEPMED='ISINP
.S DRUGCLAS=" "
.S MED=$P(NODE,U,2)
.I KEEPMED D
..S DRUGIDX=$$IENNAME^TIULMED2(MED)
..D GETCLASS
..I KEEPMED,+DRUGIDX=0 D ;Find orderable item
...N IDX,ID,ORDIDX,TMPCLASS,CDONE,SDONE,TMPIDX,TMPNODE,ISSUPPLY
...S ID=$P(NODE,U),IDX=+ID,ID=$E(ID,$L(IDX)+1,$L(ID))
...S (DRUGIDX,ORDIDX)=0
...K ^TMP($J,"TIULMED")
...; IDX is Order #; ID indicates what file. See IA 2400
...; R;O MED will always be in Drug File (Unless Drug File entry was
...; changed after ordering.
...I ID="R;O" D
....D RX^PSO52API(DFN,"TIULMED",IDX,"","0,O") ; IA 4820
....S DRUGIDX=+$G(^TMP($J,"TIULMED",DFN,IDX,6))
....S ORDIDX=+$G(^TMP($J,"TIULMED",DFN,IDX,"OI"))
...I ID="P;O" D
....D PEN^PSO5241(DFN,"TIULMED",IDX) ; IA 4821
....S DRUGIDX=+$G(^TMP($J,"TIULMED",DFN,IDX,11))
....S ORDIDX=+$G(^TMP($J,"TIULMED",DFN,IDX,8))
...I ID="P;I" D
....I $P($G(^PS(53.1,IDX,1,0)),U,4)=1 D
.....S TMPIDX=$O(^PS(53.1,IDX,1,0)) I +TMPIDX D
......S DRUGIDX=$P($G(^PS(53.1,IDX,1,TMPIDX,0)),U)
....S ORDIDX=+$P($G(^PS(53.1,IDX,.2)),U)
...I ID="U;I" D
....D PSS431^PSS55(DFN,IDX,"","","TIULMED") ; IA 4826
....I +$G(^TMP($J,"TIULMED",IDX,"DDRUG",0))=1 D
.....S TMPIDX=$O(^TMP($J,"TIULMED",IDX,"DDRUG",0)) I +TMPIDX'>0 D
.....S DRUGIDX=+$G(^TMP($J,"TIULMED",IDX,"DDRUG",TMPIDX,.01))
....S ORDIDX=+$G(^TMP($J,"TIULMED",IDX,108))
...I ID="V;I" D
....D PSS436^PSS55(DFN,IDX,"TIULMED") ; IA 4826
....S ORDIDX=+$G(^TMP($J,"TIULMED",IDX,130))
....I ^TMP($J,"TIULMED",IDX,"ADD",0)=1 D
.....S TMPIDX=$O(^TMP($J,"TIULMED",IDX,"ADD",0)) I +TMPIDX D
......S TMPIDX=+$G(^TMP($J,"TIULMED",IDX,"ADD",TMPIDX,.01))
......I +TMPIDX S DRUGIDX=$$DRGIEN^TIULMED2(TMPIDX) ; IA 4662
...S DRUGCLAS=""
...D GETCLASS
...I KEEPMED,+DRUGIDX=0,+ORDIDX,DRUGCLAS="" D
....S IDX=0,ISSUPPLY=2,CDONE='CLASSORT,SDONE=+SUPPLIES
....N LIST S LIST="TIULMED" K ^TMP($J,LIST)
....D DRGIEN^PSS50P7(ORDIDX,"",LIST) ; IA 4662
....F S IDX=$O(^TMP($J,LIST,IDX)) Q:'IDX D Q:(CDONE&SDONE)
.....S TMPCLASS=$$DRGCLASS^TIULMED2(IDX)
.....S TMPNODE=U_TMPCLASS_U_$$DEA^TIULMED2(IDX)
.....I 'CDONE,TMPCLASS="" S CDONE=1,DRUGCLAS=""
.....I 'CDONE D
......I DRUGCLAS="" S DRUGCLAS=TMPCLASS
......E I DRUGCLAS'=TMPCLASS S CDONE=1,DRUGCLAS=""
.....I 'SDONE D
......S ISSUPPLY=(($E(TMPCLASS,1,2)="XA")&($P(TMPNODE,U,3)["S"))
......I 'ISSUPPLY S SDONE=1
....I 'SUPPLIES,(ISSUPPLY=1) S KEEPMED=0
..I (DRUGCLAS="")!('CLASSORT) S DRUGCLAS=" "
..I AUTO=1 S $P(^TMP("PS",$J,INDEX,0),U,9)=STATUS_" (X)"
.;
.; *** Save wanted meds in "B" temp xref, removing duplicates ***
.;
.I KEEPMED D
..D ADDMED^BTIUMED1(1,1) ; Get XSTR to check for duplicates
..S IDATE=$P(NODE,U,15)
..I $P($P(NODE,U),";")["N" S IDATE=$$DT^XLFDT
..I $P(NODE,U,9)="PENDING"!($P(NODE,U,9)="HOLD") S IDATE=$$DT^XLFDT
..S OK='$D(@TARGET@("B",MED,XSTR))
..I 'OK,(IDATE>+@TARGET@("B",MED,XSTR)) S OK=1
..I 'OK,$P(@TARGET@("B",MED,XSTR),U,4)'=STATUS S OK=1
..I OK D
...S @TARGET@("B",MED,IDATE,XSTR)=IDATE_U_INDEX_U_MEDTYPE_U_STATUS_U_TYPE_U_DRUGCLAS_U_CHRONIC
...S EMPTY=0
...I DRUGCLAS=" " S UNKNOWNS=1
;
; *** Check for empty condition ***
;
I EMPTY D G LISTX
.D ADD^BTIUMED1("No Medications Found")
.D ADD^BTIUMED1(" ")
;
; *** Sort Meds in "C" temp xref - sort by Status,MedType,
; Med Name, and reverse issue date, followed by a counter
; to avoid erasing meds issued on the same day
;
S MED="",CNT=1000000
F S MED=$O(@TARGET@("B",MED)) Q:MED="" D
.S IDATE=""
.F S IDATE=$O(@TARGET@("B",MED,IDATE)) Q:IDATE="" D
..S XSTR=""
..F S XSTR=$O(@TARGET@("B",MED,IDATE,XSTR)) Q:XSTR="" D
...S NODE=@TARGET@("B",MED,IDATE,XSTR)
...S DATA=MED_U_$P(NODE,U,3)_U_$P(NODE,U,5),CNT=CNT+1
...S STATUS=$P(NODE,U,4),TYPE=$P(NODE,U,3)
...S @TARGET@("C",STATUS,TYPE,DATA,(9999999-$P(NODE,U))_CNT)=$P(NODE,U,2)_U_$P(NODE,U,5)_U_$P(NODE,U,6)_U_$P(NODE,U,3)
K @TARGET@("B")
;
; Read sorted data and save final version to TARGET
;
S (DATA,LASTCLAS,LSTINDIC)="",(LASTMEDT,LASTSTS,COUNT,TOTAL)=0
S $P(SPACE60," ",60)=" ",$P(DASH73,"=",73)="="
D WARNING^BTIUMED1
S STATUS="",MEDTYPE=""
F S STATUS=$O(@TARGET@("C",STATUS)) Q:STATUS="" D
.F S MEDTYPE=$O(@TARGET@("C",STATUS,MEDTYPE)) Q:MEDTYPE="" D
..F S DATA=$O(@TARGET@("C",STATUS,MEDTYPE,DATA)) Q:DATA="" D
...S DRUGCLAS=$P(DATA,U,2),MED=$P(DATA,U,3),CNT=""
...F S CNT=$O(@TARGET@("C",STATUS,MEDTYPE,DATA,CNT)) Q:CNT="" D
....S INDEX=@TARGET@("C",STATUS,MEDTYPE,DATA,CNT)
....S TYPE=$P(INDEX,U,2),CHRONIC=$P(INDEX,U,3),INDEX=+INDEX
....S NODE=^TMP("PS",$J,INDEX,0)
....;If hold meds, find the reason and add it to the node data
....I STATUS="HOLD" D
.....S HIEN=+($P(NODE,U))
.....S REASON=$$GET1^DIQ(52,HIEN,99,"E")
.....S NODE=NODE_U_REASON
....I CLININC=1 D
.....S HIEN=+($P(NODE,U))
.....S CLIN=$$GET1^DIQ(52,HIEN,9999999.21,"E")
.....S $P(NODE,U,2)=$P(NODE,U,2)_" "_CLIN
....E S $P(NODE,U,2)=" "_$P(NODE,U,2)
....;I (MEDTYPE'=LASTMEDT)!(STATUS'=LASTSTS)!(CLIN'=LSTINDIC) D ; Create Header
....I (STATUS'=LASTSTS)!(MEDTYPE'=LASTMEDT) D ; Create Header
.....I 'HEADER Q
.....S LASTSTS=STATUS,LASTMEDT=MEDTYPE,TAB=0
.....I COUNT>0 D ADD^BTIUMED1(" ")
.....S COUNT=0
.....I MEDTYPE=OUTPTYPE D I 1
......;D ADD^BTIUMED1(SPACE60_"Issue Date")
......;D ADD^BTIUMED1(SPACE60)
......I STATUS["OUTSIDE" D ADD^BTIUMED1($E($E(SPACE60,1,47)_"Status"_SPACE60,1,60))
......E I STATUS'="OUTSIDE" D ADD^BTIUMED1($E($E(SPACE60,1,47)_"Status"_SPACE60,1,60)_"Last Fill")
.....S TEMP=STATUS_" "
.....;S TEMP=$S(STATIDX=1:"Active",STATIDX=2:"Pending",1:"Inactive")_" "
.....S TEMP=TEMP_$S(MEDTYPE=INPTYPE:"Inpatient",MEDTYPE=NVATYPE:$$GET^XPAR("ALL","BEHORX NONVA LABEL"),1:"Outpatient")
.....S TEMP=" "_TEMP_" Medications"
.....S TEMP=$E(TEMP_SPACE60,1,47)
.....I MEDTYPE=INPTYPE S TEMP=TEMP_"Status"
.....E I STATUS="OUTSIDE" S TEMP=TEMP
.....E S TEMP=TEMP_"Refills"
.....S TEMP=$E(TEMP_SPACE60,1,60)
.....I MEDTYPE=INPTYPE S TEMP=TEMP_"Stop Date"
.....E I STATUS'="OUTSIDE" S TEMP=TEMP_"Expiration"
.....D ADD^BTIUMED1(TEMP),ADD^BTIUMED1(DASH73)
....S COUNT=COUNT+1,TOTAL=TOTAL+1
....D ADDMED^BTIUMED1(0,1)
I COUNT'=TOTAL D
.S TAB=0
.D ADD^BTIUMED1(" ")
.D ADD^BTIUMED1("(X)behind status of medication depicts that the medication was sent to an external pharmacy")
K @TARGET@("C")
LISTX K ^TMP("PS",$J)
Q "~@"_$NA(@TARGET)
;
GETCLASS ; Get Drug Class, filter out supplies
D GETCLASS^TIULMED3
Q
BTIUMED2 ; IHS/MSC/MGH - Active/Recent Med Objects Routine ;12-Dec-2013 16:03;DU
+1 ;;1.0;TEXT INTEGRATION UTILITIES;**1006,1007,1009,1010,1011,1012,1013**;Jun 20, 1997;Build 33
+2 ;Patch 1011 changed to use new pharmacy APIS
+3 QUIT
LIST(DFN,TARGET,CLININC) ; EP
+1 ;
+2 ; This is the TIU Medication object for medication reconciliation .
+3 ;
+4 ;Required Parameters:
+5 ;
+6 ; DFN Patient identifier
+7 ;
+8 ; TARGET Where the medication data will be stored
+9 ;
+10 ;Optional Parameters:
+11 ;
+12 ; CLININC 1=Clinical Indication will be included
+13 ;
+14 NEW NEXTLINE,EMPTY,INDEX,NODE,ISINP,KEEPMED,STATUS,OK,RXNO,CHRONIC,LDATE,CANDATE,EXDATE,DETAILED
+15 NEW INPTYPE,OUTPTYPE,TYPE,MEDTYPE,CNT,DATA,DATA1,MED,IDATE,XSTR,LLEN,DAYS,ACTVONLY,ONELIST
+16 NEW LASTMEDT,LASTSTS,COUNT,TOTAL,SPACE60,DASH73,TEMP,LINE,TAB,HEADER,CLASSORT
+17 NEW IFN,DRUGCLAS,DRUGIDX,LASTCLAS,OLDTAB,OLDHEADR,UNKNOWNS,LSTINDIC,SUPPLIES,AUTO
+18 NEW NVATYPE,NVAMED,NVASTR,TIUXSTAT,CLIN,HIEN,IEN,REASON,REFILLS,COUNTER,EVENT
+19 ;Clean up after external calls...
NEW %,%H,STOP,LSTFD
+20 SET (NEXTLINE,TAB,HEADER,UNKNOWNS)=0
SET LLEN=47
+21 KILL @TARGET,^TMP("PS",$JOB)
+22 ; Check for Pharmacy Package and required patches
+23 ;P213
IF '$$PATCHSOK^TIULMED3
GOTO LISTX
+24 IF $GET(CLININC)'=1
SET CLININC=0
+25 SET (EMPTY,HEADER)=1
+26 SET HEADER=1
+27 ; Is this an inpatient?
SET ISINP=($GET(^DPT(DFN,.1))'="")
+28 SET OUTPTYPE=1
SET INPTYPE=2
SET NVATYPE=3
+29 ;
+30 ; *** Scan medication data and skip unwanted meds ***
+31 ;
+32 SET DAYS=180
SET ACTVONLY=0
SET ONELIST=0
SET DETAILED=1
+33 DO OCL^PSOORRL(DFN,$$FMADD^XLFDT(DT,-DAYS),"")
+34 SET INDEX=0
SET CLASSORT=0
SET SUPPLIES=0
+35 FOR
SET INDEX=$ORDER(^TMP("PS",$JOB,INDEX))
IF INDEX'>0
QUIT
Begin DoDot:1
+36 SET CHRONIC=""
SET AUTO=0
+37 SET NODE=$GET(^TMP("PS",$JOB,INDEX,0))
+38 ;Discard Blank Meds
SET KEEPMED=($LENGTH($PIECE(NODE,U,2))>0)
+39 ;Group meds by status
+40 SET STATUS=$PIECE(NODE,U,9)
+41 IF STATUS="ACTIVE/SUSP"
SET STATUS="ACTIVE (S)"
+42 SET IDATE=$PIECE(NODE,U,15)
+43 IF $PIECE(NODE,U)["R;O"
Begin DoDot:2
+44 SET RXNO=+($PIECE(NODE,U,1))
+45 SET AUTO=$PIECE($GET(^PSRX(RXNO,999999921)),U,3)
End DoDot:2
+46 SET TYPE=$PIECE($PIECE(NODE,U),";",2)
+47 SET TYPE=$SELECT(TYPE="O":"OP",TYPE="I":"UD",1:"")
+48 SET NVAMED=$PIECE($PIECE(NODE,U),";")
+49 SET NVAMED=$EXTRACT(NVAMED,$LENGTH(NVAMED))
+50 IF NVAMED="N"
Begin DoDot:2
+51 SET IFN=+$PIECE(NODE,U,8)
+52 SET STATUS=$$NVSTS^BEHORXFN(IFN,$PIECE(NODE,U,9))
+53 SET $PIECE(NODE,U,9)=STATUS
End DoDot:2
+54 IF STATUS="EXPIRED"
Begin DoDot:2
+55 IF $PIECE($PIECE(NODE,U),";",2)["O"
Begin DoDot:3
+56 SET RXNO=+($PIECE(NODE,U,1))
+57 SET CHRONIC=$PIECE($GET(^PSRX(RXNO,9999999)),U,2)
+58 NEW X,X1,X2
+59 IF CHRONIC
SET X1=DT
SET X2=-120
DO C^%DTC
SET LDATE=X
+60 IF '$TEST
SET X1=DT
SET X2=-14
DO C^%DTC
SET LDATE=X
+61 SET EXDATE=$PIECE($GET(^PSRX(RXNO,2)),U,6)
+62 IF EXDATE<LDATE
SET KEEPMED=0
End DoDot:3
+63 IF $PIECE($PIECE(NODE,U),";",2)["I"
Begin DoDot:3
+64 SET EXDATE=$PIECE(NODE,U,4)
+65 SET X1=DT
SET X2=-14
DO C^%DTC
SET LDATE=X
+66 IF EXDATE<LDATE
SET KEEPMED=0
End DoDot:3
End DoDot:2
+67 IF STATUS["DISCONTINUED"
Begin DoDot:2
+68 IF TYPE="OP"
Begin DoDot:3
+69 IF NVAMED="N"
SET KEEPMED=0
QUIT
+70 SET X1=DT
SET X2=-30
DO C^%DTC
SET LDATE=X
+71 SET CANDATE=$PIECE($GET(^PSRX(RXNO,3)),U,5)
+72 IF CANDATE<LDATE
SET KEEPMED=0
End DoDot:3
+73 IF TYPE="UD"
Begin DoDot:3
+74 SET X1=DT
SET X2=-2
DO C^%DTC
SET LDATE=X
+75 SET CANDATE=$PIECE(NODE,U,4)
+76 IF CANDATE<LDATE
SET KEEPMED=0
End DoDot:3
+77 IF STATUS="DISCONTINUED/EDIT"!(STATUS="DISCONTINUED (EDIT)")
SET KEEPMED=0
End DoDot:2
+78 IF STATUS="PENDING"
Begin DoDot:2
+79 SET IEN=+($PIECE(NODE,U))
+80 IF IEN>0
SET REFILLS=$PIECE($GET(^PS(52.41,IEN,0)),U,11)
+81 SET $PIECE(^TMP("PS",$JOB,INDEX,0),U,5)=REFILLS
End DoDot:2
+82 IF $PIECE($PIECE(NODE,U),";")["N"
Begin DoDot:2
+83 IF STATUS="HOLD"!(STATUS["TRANSFER")
SET STATUS=STATUS
+84 IF '$TEST
SET STATUS="ACTIVE"
End DoDot:2
+85 IF TYPE=""
SET KEEPMED=0
+86 IF KEEPMED
Begin DoDot:2
+87 IF $ORDER(^TMP("PS",$JOB,INDEX,"A",0))>0
SET TYPE="IV"
+88 IF '$TEST
IF $ORDER(^TMP("PS",$JOB,INDEX,"B",0))>0
SET TYPE="IV"
+89 IF TYPE="OP"
SET MEDTYPE=OUTPTYPE
+90 IF '$TEST
SET MEDTYPE=INPTYPE
+91 IF NVAMED="N"
SET MEDTYPE=NVATYPE
+92 ;I MEDTYPE=INPTYPE S KEEPMED=ISINP
+93 ;E S KEEPMED='ISINP
End DoDot:2
+94 SET DRUGCLAS=" "
+95 SET MED=$PIECE(NODE,U,2)
+96 IF KEEPMED
Begin DoDot:2
+97 SET DRUGIDX=$$IENNAME^TIULMED2(MED)
+98 DO GETCLASS
+99 ;Find orderable item
IF KEEPMED
IF +DRUGIDX=0
Begin DoDot:3
+100 NEW IDX,ID,ORDIDX,TMPCLASS,CDONE,SDONE,TMPIDX,TMPNODE,ISSUPPLY
+101 SET ID=$PIECE(NODE,U)
SET IDX=+ID
SET ID=$EXTRACT(ID,$LENGTH(IDX)+1,$LENGTH(ID))
+102 SET (DRUGIDX,ORDIDX)=0
+103 KILL ^TMP($JOB,"TIULMED")
+104 ; IDX is Order #; ID indicates what file. See IA 2400
+105 ; R;O MED will always be in Drug File (Unless Drug File entry was
+106 ; changed after ordering.
+107 IF ID="R;O"
Begin DoDot:4
+108 ; IA 4820
DO RX^PSO52API(DFN,"TIULMED",IDX,"","0,O")
+109 SET DRUGIDX=+$GET(^TMP($JOB,"TIULMED",DFN,IDX,6))
+110 SET ORDIDX=+$GET(^TMP($JOB,"TIULMED",DFN,IDX,"OI"))
End DoDot:4
+111 IF ID="P;O"
Begin DoDot:4
+112 ; IA 4821
DO PEN^PSO5241(DFN,"TIULMED",IDX)
+113 SET DRUGIDX=+$GET(^TMP($JOB,"TIULMED",DFN,IDX,11))
+114 SET ORDIDX=+$GET(^TMP($JOB,"TIULMED",DFN,IDX,8))
End DoDot:4
+115 IF ID="P;I"
Begin DoDot:4
+116 IF $PIECE($GET(^PS(53.1,IDX,1,0)),U,4)=1
Begin DoDot:5
+117 SET TMPIDX=$ORDER(^PS(53.1,IDX,1,0))
IF +TMPIDX
Begin DoDot:6
+118 SET DRUGIDX=$PIECE($GET(^PS(53.1,IDX,1,TMPIDX,0)),U)
End DoDot:6
End DoDot:5
+119 SET ORDIDX=+$PIECE($GET(^PS(53.1,IDX,.2)),U)
End DoDot:4
+120 IF ID="U;I"
Begin DoDot:4
+121 ; IA 4826
DO PSS431^PSS55(DFN,IDX,"","","TIULMED")
+122 IF +$GET(^TMP($JOB,"TIULMED",IDX,"DDRUG",0))=1
Begin DoDot:5
+123 SET TMPIDX=$ORDER(^TMP($JOB,"TIULMED",IDX,"DDRUG",0))
IF +TMPIDX'>0
Begin DoDot:6
End DoDot:6
+124 SET DRUGIDX=+$GET(^TMP($JOB,"TIULMED",IDX,"DDRUG",TMPIDX,.01))
End DoDot:5
+125 SET ORDIDX=+$GET(^TMP($JOB,"TIULMED",IDX,108))
End DoDot:4
+126 IF ID="V;I"
Begin DoDot:4
+127 ; IA 4826
DO PSS436^PSS55(DFN,IDX,"TIULMED")
+128 SET ORDIDX=+$GET(^TMP($JOB,"TIULMED",IDX,130))
+129 IF ^TMP($JOB,"TIULMED",IDX,"ADD",0)=1
Begin DoDot:5
+130 SET TMPIDX=$ORDER(^TMP($JOB,"TIULMED",IDX,"ADD",0))
IF +TMPIDX
Begin DoDot:6
+131 SET TMPIDX=+$GET(^TMP($JOB,"TIULMED",IDX,"ADD",TMPIDX,.01))
+132 ; IA 4662
IF +TMPIDX
SET DRUGIDX=$$DRGIEN^TIULMED2(TMPIDX)
End DoDot:6
End DoDot:5
End DoDot:4
+133 SET DRUGCLAS=""
+134 DO GETCLASS
+135 IF KEEPMED
IF +DRUGIDX=0
IF +ORDIDX
IF DRUGCLAS=""
Begin DoDot:4
+136 SET IDX=0
SET ISSUPPLY=2
SET CDONE='CLASSORT
SET SDONE=+SUPPLIES
+137 NEW LIST
SET LIST="TIULMED"
KILL ^TMP($JOB,LIST)
+138 ; IA 4662
DO DRGIEN^PSS50P7(ORDIDX,"",LIST)
+139 FOR
SET IDX=$ORDER(^TMP($JOB,LIST,IDX))
IF 'IDX
QUIT
Begin DoDot:5
+140 SET TMPCLASS=$$DRGCLASS^TIULMED2(IDX)
+141 SET TMPNODE=U_TMPCLASS_U_$$DEA^TIULMED2(IDX)
+142 IF 'CDONE
IF TMPCLASS=""
SET CDONE=1
SET DRUGCLAS=""
+143 IF 'CDONE
Begin DoDot:6
+144 IF DRUGCLAS=""
SET DRUGCLAS=TMPCLASS
+145 IF '$TEST
IF DRUGCLAS'=TMPCLASS
SET CDONE=1
SET DRUGCLAS=""
End DoDot:6
+146 IF 'SDONE
Begin DoDot:6
+147 SET ISSUPPLY=(($EXTRACT(TMPCLASS,1,2)="XA")&($PIECE(TMPNODE,U,3)["S"))
+148 IF 'ISSUPPLY
SET SDONE=1
End DoDot:6
End DoDot:5
IF (CDONE&SDONE)
QUIT
+149 IF 'SUPPLIES
IF (ISSUPPLY=1)
SET KEEPMED=0
End DoDot:4
End DoDot:3
+150 IF (DRUGCLAS="")!('CLASSORT)
SET DRUGCLAS=" "
+151 IF AUTO=1
SET $PIECE(^TMP("PS",$JOB,INDEX,0),U,9)=STATUS_" (X)"
End DoDot:2
+152 ;
+153 ; *** Save wanted meds in "B" temp xref, removing duplicates ***
+154 ;
+155 IF KEEPMED
Begin DoDot:2
+156 ; Get XSTR to check for duplicates
DO ADDMED^BTIUMED1(1,1)
+157 SET IDATE=$PIECE(NODE,U,15)
+158 IF $PIECE($PIECE(NODE,U),";")["N"
SET IDATE=$$DT^XLFDT
+159 IF $PIECE(NODE,U,9)="PENDING"!($PIECE(NODE,U,9)="HOLD")
SET IDATE=$$DT^XLFDT
+160 SET OK='$DATA(@TARGET@("B",MED,XSTR))
+161 IF 'OK
IF (IDATE>+@TARGET@("B",MED,XSTR))
SET OK=1
+162 IF 'OK
IF $PIECE(@TARGET@("B",MED,XSTR),U,4)'=STATUS
SET OK=1
+163 IF OK
Begin DoDot:3
+164 SET @TARGET@("B",MED,IDATE,XSTR)=IDATE_U_INDEX_U_MEDTYPE_U_STATUS_U_TYPE_U_DRUGCLAS_U_CHRONIC
+165 SET EMPTY=0
+166 IF DRUGCLAS=" "
SET UNKNOWNS=1
End DoDot:3
End DoDot:2
End DoDot:1
+167 ;
+168 ; *** Check for empty condition ***
+169 ;
+170 IF EMPTY
Begin DoDot:1
+171 DO ADD^BTIUMED1("No Medications Found")
+172 DO ADD^BTIUMED1(" ")
End DoDot:1
GOTO LISTX
+173 ;
+174 ; *** Sort Meds in "C" temp xref - sort by Status,MedType,
+175 ; Med Name, and reverse issue date, followed by a counter
+176 ; to avoid erasing meds issued on the same day
+177 ;
+178 SET MED=""
SET CNT=1000000
+179 FOR
SET MED=$ORDER(@TARGET@("B",MED))
IF MED=""
QUIT
Begin DoDot:1
+180 SET IDATE=""
+181 FOR
SET IDATE=$ORDER(@TARGET@("B",MED,IDATE))
IF IDATE=""
QUIT
Begin DoDot:2
+182 SET XSTR=""
+183 FOR
SET XSTR=$ORDER(@TARGET@("B",MED,IDATE,XSTR))
IF XSTR=""
QUIT
Begin DoDot:3
+184 SET NODE=@TARGET@("B",MED,IDATE,XSTR)
+185 SET DATA=MED_U_$PIECE(NODE,U,3)_U_$PIECE(NODE,U,5)
SET CNT=CNT+1
+186 SET STATUS=$PIECE(NODE,U,4)
SET TYPE=$PIECE(NODE,U,3)
+187 SET @TARGET@("C",STATUS,TYPE,DATA,(9999999-$PIECE(NODE,U))_CNT)=$PIECE(NODE,U,2)_U_$PIECE(NODE,U,5)_U_$PIECE(NODE,U,6)_U_$PIECE(NODE,U,3)
End DoDot:3
End DoDot:2
End DoDot:1
+188 KILL @TARGET@("B")
+189 ;
+190 ; Read sorted data and save final version to TARGET
+191 ;
+192 SET (DATA,LASTCLAS,LSTINDIC)=""
SET (LASTMEDT,LASTSTS,COUNT,TOTAL)=0
+193 SET $PIECE(SPACE60," ",60)=" "
SET $PIECE(DASH73,"=",73)="="
+194 DO WARNING^BTIUMED1
+195 SET STATUS=""
SET MEDTYPE=""
+196 FOR
SET STATUS=$ORDER(@TARGET@("C",STATUS))
IF STATUS=""
QUIT
Begin DoDot:1
+197 FOR
SET MEDTYPE=$ORDER(@TARGET@("C",STATUS,MEDTYPE))
IF MEDTYPE=""
QUIT
Begin DoDot:2
+198 FOR
SET DATA=$ORDER(@TARGET@("C",STATUS,MEDTYPE,DATA))
IF DATA=""
QUIT
Begin DoDot:3
+199 SET DRUGCLAS=$PIECE(DATA,U,2)
SET MED=$PIECE(DATA,U,3)
SET CNT=""
+200 FOR
SET CNT=$ORDER(@TARGET@("C",STATUS,MEDTYPE,DATA,CNT))
IF CNT=""
QUIT
Begin DoDot:4
+201 SET INDEX=@TARGET@("C",STATUS,MEDTYPE,DATA,CNT)
+202 SET TYPE=$PIECE(INDEX,U,2)
SET CHRONIC=$PIECE(INDEX,U,3)
SET INDEX=+INDEX
+203 SET NODE=^TMP("PS",$JOB,INDEX,0)
+204 ;If hold meds, find the reason and add it to the node data
+205 IF STATUS="HOLD"
Begin DoDot:5
+206 SET HIEN=+($PIECE(NODE,U))
+207 SET REASON=$$GET1^DIQ(52,HIEN,99,"E")
+208 SET NODE=NODE_U_REASON
End DoDot:5
+209 IF CLININC=1
Begin DoDot:5
+210 SET HIEN=+($PIECE(NODE,U))
+211 SET CLIN=$$GET1^DIQ(52,HIEN,9999999.21,"E")
+212 SET $PIECE(NODE,U,2)=$PIECE(NODE,U,2)_" "_CLIN
End DoDot:5
+213 IF '$TEST
SET $PIECE(NODE,U,2)=" "_$PIECE(NODE,U,2)
+214 ;I (MEDTYPE'=LASTMEDT)!(STATUS'=LASTSTS)!(CLIN'=LSTINDIC) D ; Create Header
+215 ; Create Header
IF (STATUS'=LASTSTS)!(MEDTYPE'=LASTMEDT)
Begin DoDot:5
+216 IF 'HEADER
QUIT
+217 SET LASTSTS=STATUS
SET LASTMEDT=MEDTYPE
SET TAB=0
+218 IF COUNT>0
DO ADD^BTIUMED1(" ")
+219 SET COUNT=0
+220 IF MEDTYPE=OUTPTYPE
Begin DoDot:6
+221 ;D ADD^BTIUMED1(SPACE60_"Issue Date")
+222 ;D ADD^BTIUMED1(SPACE60)
+223 IF STATUS["OUTSIDE"
DO ADD^BTIUMED1($EXTRACT($EXTRACT(SPACE60,1,47)_"Status"_SPACE60,1,60))
+224 IF '$TEST
IF STATUS'="OUTSIDE"
DO ADD^BTIUMED1($EXTRACT($EXTRACT(SPACE60,1,47)_"Status"_SPACE60,1,60)_"Last Fill")
End DoDot:6
IF 1
+225 SET TEMP=STATUS_" "
+226 ;S TEMP=$S(STATIDX=1:"Active",STATIDX=2:"Pending",1:"Inactive")_" "
+227 SET TEMP=TEMP_$SELECT(MEDTYPE=INPTYPE:"Inpatient",MEDTYPE=NVATYPE:$$GET^XPAR("ALL","BEHORX NONVA LABEL"),1:"Outpatient")
+228 SET TEMP=" "_TEMP_" Medications"
+229 SET TEMP=$EXTRACT(TEMP_SPACE60,1,47)
+230 IF MEDTYPE=INPTYPE
SET TEMP=TEMP_"Status"
+231 IF '$TEST
IF STATUS="OUTSIDE"
SET TEMP=TEMP
+232 IF '$TEST
SET TEMP=TEMP_"Refills"
+233 SET TEMP=$EXTRACT(TEMP_SPACE60,1,60)
+234 IF MEDTYPE=INPTYPE
SET TEMP=TEMP_"Stop Date"
+235 IF '$TEST
IF STATUS'="OUTSIDE"
SET TEMP=TEMP_"Expiration"
+236 DO ADD^BTIUMED1(TEMP)
DO ADD^BTIUMED1(DASH73)
End DoDot:5
+237 SET COUNT=COUNT+1
SET TOTAL=TOTAL+1
+238 DO ADDMED^BTIUMED1(0,1)
End DoDot:4
End DoDot:3
End DoDot:2
End DoDot:1
+239 IF COUNT'=TOTAL
Begin DoDot:1
+240 SET TAB=0
+241 DO ADD^BTIUMED1(" ")
+242 DO ADD^BTIUMED1("(X)behind status of medication depicts that the medication was sent to an external pharmacy")
End DoDot:1
+243 KILL @TARGET@("C")
LISTX KILL ^TMP("PS",$JOB)
+1 QUIT "~@"_$NAME(@TARGET)
+2 ;
GETCLASS ; Get Drug Class, filter out supplies
+1 DO GETCLASS^TIULMED3
+2 QUIT