- 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