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

BTIUMED5.m

Go to the documentation of this file.
  1. BTIUMED5 ; SLC/JM - Active/Recent Med Objects Routine ;27-Apr-2016 11:31;DU
  1. ;;1.0;TEXT INTEGRATION UTILITIES;**1006,1011,1016**;Jun 20, 1997;Build 10
  1. ;Patch 1011 changed to use pharmacy APIS
  1. Q
  1. LIST(DFN,TARGET,ACTVONLY,ONELIST,CLASSORT,SUPPLIES,CLININC) ; EP
  1. ;
  1. ; Medication object for detailed meds for pharmacists
  1. ;
  1. ;
  1. ;Required Parameters:
  1. ;
  1. ; DFN Patient identifier
  1. ;
  1. ; TARGET Where the medication data will be stored
  1. ;
  1. ;Optional Parameters:
  1. ;
  1. ; ACTVONLY 0 - Active and recently expired meds
  1. ; 1 - Active meds only
  1. ; 2 - Recently expired meds only
  1. ; 3 - Hold meds only
  1. ;
  1. ;
  1. ; ONELIST 0 - Separates Active, Pending and Inactive
  1. ; medications into separate lists
  1. ; 1 - Combines Active, Pending and Inactive
  1. ; medications into the same list
  1. ;
  1. ; CLASSORT 0 - Sort meds alphabetically
  1. ; 1 - Sort meds by drug class, and within the
  1. ; same drug class, sort alphabetically
  1. ; 2 - Same as #1, but show drug class in header
  1. ; SUPPLIES 0 - Supplies are excluded
  1. ; 1 - Supplies are included (Default)
  1. ; CLININC 0- Do not use
  1. ; 1- Display in detailed format
  1. ; 2- Sort by
  1. ;
  1. N NEXTLINE,EMPTY,INDEX,NODE,ISINP,KEEPMED,STATUS,ASTATS,PSTATS,OK,RXNO,CHRONIC
  1. N STATIDX,INPTYPE,OUTPTYPE,TYPE,MEDTYPE,CNT,DATA,DATA1,MED,IDATE,XSTR,LLEN,DAYS
  1. N LASTMEDT,LASTSTS,COUNT,TOTAL,SPACE60,DASH73,TEMP,LINE,TAB,HEADER,RXNUM,IEN,AUTO
  1. N DRUGCLAS,DRUGIDX,LASTCLAS,OLDTAB,OLDHEADR,UNKNOWNS,INDIC,LSTINDIC,PHARM,HSTATS
  1. N %,%H,STOP,LSTFD,ALLMEDS,CLASS,DETAILED,DRUG,REASON,REFILLS,FILLS,NRXN,HIEN,ERX
  1. S (NEXTLINE,TAB,HEADER,UNKNOWNS)=0,LLEN=47
  1. S PHARM=1
  1. K @TARGET,^TMP("PS",$J)
  1. ; Check for Pharmacy Package and required patches
  1. I '$$PATCHSOK^TIULMED3 G LISTX ;P213
  1. I '+$G(ACTVONLY) S ACTVONLY=0
  1. I '+$G(DETAILED) S DETAILED=0
  1. S ALLMEDS=3,DETAILED=1
  1. I '+$G(ONELIST) S ONELIST=0
  1. I '+$G(CLASSORT) S CLASSORT=0
  1. I $G(SUPPLIES)'="0" S SUPPLIES=1
  1. I '+$G(CLININC) S CLININC=0
  1. S (EMPTY,HEADER)=1
  1. I ONELIST,'CLASSORT,'CLININC S HEADER=0
  1. S ASTATS="^ACTIVE^REFILL^HOLD^PROVIDER HOLD^ON CALL^ACTIVE (S)^"
  1. S PSTATS="^NON-VERIFIED^DRUG INTERACTIONS^INCOMPLETE^PENDING^"
  1. S HSTATS="^HOLD^"
  1. S ISINP=($G(^DPT(DFN,.1))'="") ; Is this an inpatient?
  1. S DAYS=$$GET^XPAR("ALL","BTIU EXPIRED MEDS",1,"E")
  1. S:$G(DAYS)<1 DAYS=365
  1. D ADDTITLE^BTIUMED1(DAYS)
  1. ;
  1. ; *** Scan medication data and skip unwanted meds ***
  1. ;
  1. D OCL^PSOORRL(DFN,$$FMADD^XLFDT(DT,-DAYS),"")
  1. S INDEX=0,INDIC="",AUTO=0,ERX=""
  1. F S INDEX=$O(^TMP("PS",$J,INDEX)) Q:INDEX'>0 D
  1. .S NODE=$G(^TMP("PS",$J,INDEX,0))
  1. .S RXNO=+($P(NODE,U,1))
  1. .S AUTO=$P($G(^PSRX(RXNO,999999921)),U,3)
  1. .S CHRONIC=$P($G(^PSRX(RXNO,9999999)),U,2)
  1. .S KEEPMED=($L($P(NODE,U,2))>0) ;Discard Blank Meds
  1. .I KEEPMED D
  1. ..S STATUS=$P(NODE,U,9)
  1. ..I STATUS="SUSPENDED" S STATUS="ACTIVE (S)"
  1. ..I STATUS="ACTIVE/SUSP" S STATUS="ACTIVE (S)"
  1. ..I STATUS="PENDING" D
  1. ...S IEN=+($P(NODE,U))
  1. ...I IEN>0 S REFILLS=$P($G(^PS(52.41,IEN,0)),U,11)
  1. ...S $P(^TMP("PS",$J,INDEX,0),U,5)=REFILLS
  1. ..I $F(ASTATS,"^"_STATUS_"^")>0 S STATIDX=1
  1. ..E I ($F(PSTATS,"^"_STATUS_"^")>0) S STATIDX=2
  1. ..E S STATIDX=3
  1. ..I ACTVONLY=1 S KEEPMED=(STATIDX<3)
  1. ..I ACTVONLY=2 S KEEPMED=(STATIDX=3)
  1. ..I ACTVONLY=3 D
  1. ...S KEEPMED=""
  1. ...I STATUS="HOLD" S KEEPMED=4
  1. ..;I +ONELIST S STATIDX=1
  1. .I KEEPMED D
  1. ..S TYPE=$P($P(NODE,U),";",2)
  1. ..S TYPE=$S(TYPE="O":"OP",TYPE="I":"UD",1:"")
  1. ..S KEEPMED=(TYPE'="")
  1. .I KEEPMED D
  1. ..I $O(^TMP("PS",$J,INDEX,"A",0))>0 S TYPE="IV"
  1. ..E I $O(^TMP("PS",$J,INDEX,"B",0))>0 S TYPE="IV"
  1. ..S MEDTYPE=1
  1. ..I ALLMEDS=3 S KEEPMED=MEDTYPE
  1. .S DRUGCLAS=" "
  1. .S MED=$P(NODE,U,2)
  1. .I KEEPMED,(CLASSORT!('SUPPLIES)) D
  1. ..S DRUGIDX=$$IENNAME^TIULMED2(MED)
  1. ..D GETCLASS
  1. ..I KEEPMED,+DRUGIDX=0 D ;Find orderable item
  1. ...N IDX,ID,ORDIDX,TMPCLASS,CDONE,SDONE,TMPIDX,TMPNODE,ISSUPPLY
  1. ...S ID=$P(NODE,U),IDX=+ID,ID=$E(ID,$L(IDX)+1,$L(ID))
  1. ...S (DRUGIDX,ORDIDX)=0
  1. ...K ^TMP($J,"TIULMED")
  1. ...; IDX is Order #; ID indicates what file. See IA 2400
  1. ...; R;O MED will always be in Drug File (Unless Drug File entry was
  1. ...; changed after ordering.
  1. ...I ID="R;O" D
  1. ....D RX^PSO52API(DFN,"TIULMED",IDX,"","0,O") ; IA 4820
  1. ....S DRUGIDX=+$G(^TMP($J,"TIULMED",DFN,IDX,6))
  1. ....S ORDIDX=+$G(^TMP($J,"TIULMED",DFN,IDX,"OI"))
  1. ...I ID="P;O" D
  1. ....D PEN^PSO5241(DFN,"TIULMED",IDX) ; IA 4821
  1. ....S DRUGIDX=+$G(^TMP($J,"TIULMED",DFN,IDX,11))
  1. ....S ORDIDX=+$G(^TMP($J,"TIULMED",DFN,IDX,8))
  1. ...I ID="V;I" D
  1. ....D PSS436^PSS55(DFN,IDX,"TIULMED") ; IA 4826
  1. ....; Get ORDIDX before DRUGIDX since global is not there after DRUGIDX
  1. ....S ORDIDX=+$G(^TMP($J,"TIULMED",IDX,130))
  1. ....I ^TMP($J,"TIULMED",IDX,"ADD",0)=1 D
  1. .....S TMPIDX=$O(^TMP($J,"TIULMED",IDX,"ADD",0)) I +TMPIDX D
  1. ......S TMPIDX=+$G(^TMP($J,"TIULMED",IDX,"ADD",TMPIDX,.01))
  1. ......I +TMPIDX S DRUGIDX=$$DRGIEN^TIULMED2(TMPIDX) ; IA 4662
  1. ...S DRUGCLAS=""
  1. ...D GETCLASS
  1. ...I KEEPMED,+DRUGIDX=0,+ORDIDX,DRUGCLAS="" D
  1. ....S IDX=0,ISSUPPLY=2,CDONE='CLASSORT,SDONE=+SUPPLIES
  1. ....N LIST S LIST="TIULMED" K ^TMP($J,LIST)
  1. ....D DRGIEN^PSS50P7(ORDIDX,"",LIST) ; IA 4662
  1. ....F S IDX=$O(^TMP($J,LIST,IDX)) Q:'IDX D Q:(CDONE&SDONE)
  1. .....S TMPCLASS=$$DRGCLASS^TIULMED2(IDX)
  1. .....S TMPNODE=U_TMPCLASS_U_$$DEA^TIULMED2(IDX)
  1. .....I 'CDONE,TMPCLASS="" S CDONE=1,DRUGCLAS=""
  1. .....I 'CDONE D
  1. ......I DRUGCLAS="" S DRUGCLAS=TMPCLASS
  1. ......E I DRUGCLAS'=TMPCLASS S CDONE=1,DRUGCLAS=""
  1. .....I 'SDONE D
  1. ......S ISSUPPLY=(($E(TMPCLASS,1,2)="XA")&($P(TMPNODE,U,3)["S"))
  1. ......I 'ISSUPPLY S SDONE=1
  1. ....I 'SUPPLIES,(ISSUPPLY=1) S KEEPMED=0
  1. ..I (DRUGCLAS="")!('CLASSORT) S DRUGCLAS=" "
  1. ..I AUTO=1 D
  1. ...S ERX=$P($G(^PSRX(RXNO,999999921)),U,4)
  1. ...I +ERX S ERX=ERX_";"_RXNO
  1. ...S $P(^TMP("PS",$J,INDEX,0),U,9)=STATUS_" (X)"
  1. .;
  1. .; *** Save wanted meds in "B" temp xref, removing duplicates ***
  1. .;
  1. .I KEEPMED D
  1. ..D ADDMED^BTIUMED1(1) ; Get XSTR to check for duplicates
  1. ..S IDATE=$P(NODE,U,15)
  1. ..I $P($P(NODE,U),";")["N" S IDATE=$$DT^XLFDT
  1. ..I $P(NODE,U,9)="PENDING"!($P(NODE,U,9)="HOLD") S IDATE=$$DT^XLFDT
  1. ..S OK='$D(@TARGET@("B",MED,IDATE,XSTR))
  1. ..I 'OK,(IDATE>@TARGET@("B",MED,IDATE,XSTR)) S OK=1
  1. ..I OK D
  1. ...S @TARGET@("B",MED,IDATE,XSTR)=IDATE_U_INDEX_U_MEDTYPE_U_STATIDX_U_TYPE_U_DRUGCLAS_U_CHRONIC_U_ERX
  1. ...S EMPTY=0
  1. ...I DRUGCLAS=" " S UNKNOWNS=1
  1. ;
  1. ; *** Check for empty condition ***
  1. ;
  1. I EMPTY D G LISTX
  1. .D ADD^BTIUMED1("No Medications Found")
  1. .D ADD^BTIUMED1(" ")
  1. ;
  1. ; *** Sort Meds in "C" temp xref - sort by Med Type, Status
  1. ; Med Name, and reverse issue date, followed by a counter
  1. ; to avoid erasing meds issued on the same day
  1. ;
  1. S MED="",CNT=1000000,OUTPTYPE=1
  1. F S MED=$O(@TARGET@("B",MED)) Q:MED="" D
  1. .S IDATE=""
  1. .F S IDATE=$O(@TARGET@("B",MED,IDATE)) Q:IDATE="" D
  1. ..S XSTR=""
  1. ..F S XSTR=$O(@TARGET@("B",MED,IDATE,XSTR)) Q:XSTR="" D
  1. ...S NODE=@TARGET@("B",MED,IDATE,XSTR)
  1. ...S DATA=MED_U_$P(NODE,U,3)_U_$P(NODE,U,5)_U_$P(NODE,19),CNT=CNT+1
  1. ...S @TARGET@("C",DATA,(9999999-$P(NODE,U))_CNT)=$P(NODE,U,2)_U_$P(NODE,U,5)_U_$P(NODE,U,7)_U_$P(NODE,U,8)
  1. K @TARGET@("B")
  1. ;
  1. ; Read sorted data and save final version to TARGET
  1. ;
  1. S (DATA,LASTCLAS,LSTINDIC)="",(LASTMEDT,LASTSTS,COUNT,TOTAL)=0
  1. S $P(SPACE60," ",60)=" ",$P(DASH73,"=",73)="="
  1. D WARNING^BTIUMED1
  1. F S DATA=$O(@TARGET@("C",DATA)) Q:DATA="" D
  1. .S DATA1=$P(DATA,U,2)
  1. .S MEDTYPE=$E(DATA1),STATIDX=$E(DATA1,2)
  1. .S DRUGCLAS=$P(DATA,U,2),MED=$P(DATA,U,3),CNT=""
  1. .F S CNT=$O(@TARGET@("C",DATA,CNT)) Q:CNT="" D
  1. ..S INDEX=@TARGET@("C",DATA,CNT)
  1. ..S TYPE=$P(INDEX,U,2),CHRONIC=$P(INDEX,U,3),ERX=$P(INDEX,U,4),INDEX=+INDEX
  1. ..S NODE=^TMP("PS",$J,INDEX,0)
  1. ..;If hold meds, find the reason and add it to the node data
  1. ..S STATUS=$P(NODE,U,9)
  1. ..I STATUS="HOLD" D
  1. ...S HIEN=+($P(NODE,U))
  1. ...S REASON=$$GET1^DIQ(52,HIEN,99,"E")
  1. ...S $P(NODE,U,18)=REASON
  1. ..S HIEN=$P(NODE,U)
  1. ..I CLININC>0 D
  1. ...;Patch 1016 changes for clinical indication
  1. ...I HIEN["R" D
  1. ....S HIEN=+HIEN
  1. ....S INDIC=$$GET1^DIQ(52,HIEN,9999999.21,"E")
  1. ....S $P(NODE,U,19)=INDIC
  1. ..I ERX'="" S $P(NODE,U,31)=ERX
  1. ..I $P($P(NODE,U),";")["N" S $P(NODE,U,2)=$P(NODE,U,2)_" (O)"
  1. ..I CHRONIC="Y" S $P(NODE,U,2)=$P(NODE,U,2)_" (C)"
  1. ..S RXNUM=$P($G(^PSRX(HIEN,0)),U,1)
  1. ..S $P(NODE,U,20)=RXNUM_" "
  1. ..S ^TMP("PS",$J,INDEX,0)=NODE
  1. ..D FILLS
  1. ..;E S $P(NODE,U,2)=" "_$P(NODE,U,2)
  1. ..;I (MEDTYPE'=LASTMEDT)!(STATIDX'=LASTSTS)!(INDIC'=LSTINDIC) D ; Create Header
  1. ..I (MEDTYPE'=LASTMEDT)!(CLININC=2&(INDIC'=LSTINDIC)) D ; Create Header
  1. ...I CLASSORT'=2,DRUGCLAS'=" " S LASTCLAS=DRUGCLAS
  1. ...I 'HEADER Q
  1. ...S LASTMEDT=MEDTYPE,LASTSTS=STATIDX,TAB=0
  1. ...I COUNT>0 D ADD^BTIUMED1(" ")
  1. ...I CLASSORT D ADD^BTIUMED1(" ")
  1. ...S COUNT=0
  1. ...I MEDTYPE=OUTPTYPE D I 1
  1. ....D ADD^BTIUMED1($E(SPACE60,1,3)_"RX No"_$E($E(SPACE60,1,38)_"Status"_SPACE60,1,52)_"Last Fill")
  1. ...S TEMP=""
  1. ...I 'ONELIST D
  1. ....S TEMP=TEMP_$S(MEDTYPE=INPTYPE:"Inpatient",1:"Outpatient")
  1. ....S TEMP=" "_TEMP_" Medications"
  1. ...I CLASSORT D
  1. ....S TEMP=TEMP_" (By Class)"
  1. ....I MEDTYPE=OUTPTYPE&(CLININC>0) S TEMP=TEMP_" (By Clinical Indication)"
  1. ...S TEMP=$E(TEMP_SPACE60,1,47)
  1. ...S TEMP=TEMP_"Refills"
  1. ...S TEMP=$E(TEMP_SPACE60,1,60)
  1. ...S TEMP=TEMP_"Expiration"
  1. ...D ADD^BTIUMED1(TEMP),ADD^BTIUMED1(DASH73)
  1. ..I CLASSORT,DRUGCLAS'="",DRUGCLAS'=LASTCLAS D
  1. ...S LASTCLAS=DRUGCLAS,OLDTAB=TAB,OLDHEADR=HEADER
  1. ..I CLININC=2,INDIC'=LSTINDIC D
  1. ...S LSTINDIC=INDIC,OLDTAB=TAB,OLDHEADR=HEADER
  1. ...S (TAB,HEADER)=0
  1. ...I COUNT>0 D ADD^BTIUMED1(" ")
  1. ...I (CLASSORT=2)!(DRUGCLAS=" ") D I 1
  1. ....I DRUGCLAS=" " S TEMP=" ====== Drug Class Unknown "
  1. ....E S TEMP=" ====== Drug Class: "_DRUGCLAS_" "
  1. ...I REASON=1 D
  1. ....I INDIC="" S TEMP=" ====== Unknown Indication "
  1. ....E S TEMP=" ====== "_INDIC_" "
  1. ...E S TEMP=" "
  1. ...S TEMP=$E(TEMP_DASH73,1,LLEN-2)
  1. ...D ADD^BTIUMED1(TEMP)
  1. ...S HEADER=OLDHEADR,TAB=OLDTAB
  1. ..S COUNT=COUNT+1,TOTAL=TOTAL+1
  1. ..D ADDMED^BTIUMED1(0)
  1. I COUNT'=TOTAL D
  1. .S TAB=0
  1. .D ADD^BTIUMED1(" ")
  1. .D ADD^BTIUMED1(TOTAL_" Total Medications")
  1. D ADD^BTIUMED1(" ")
  1. D ADD^BTIUMED1("(X)behind status of medication depicts that the medication was sent to an external pharmacy")
  1. K @TARGET@("C")
  1. LISTX K ^TMP("PS",$J)
  1. Q "~@"_$NA(@TARGET)
  1. ;
  1. GETCLASS ; Get Drug Class, filter out supplies
  1. D GETCLASS^TIULMED3
  1. Q
  1. FILLS ;Create and add nodes for fills and past fills.
  1. ;$G(^TMP("PS",$J,INDEX,0))
  1. K FILL
  1. N RFS,RF,RX2,RFL,FILL,II,PSIII,X,Y,Z
  1. S RX2=$S($D(^PSRX(HIEN,2)):^PSRX(HIEN,2),1:"")
  1. S RFL=1
  1. D FILOOP(HIEN,RX2)
  1. S Y=""
  1. F PSIII=0:0 S PSIII=$O(FILL(PSIII)) Q:'PSIII D
  1. .S X=$P($G(FILL(PSIII)),U,1)
  1. .I X=0 Q
  1. .S Z=$$FMTE^XLFDT(X)
  1. .S Y=Y_Z_" "
  1. I Y'="" D
  1. .S ^TMP("PS",$J,INDEX,"FILL",0)=1
  1. .S ^TMP("PS",$J,INDEX,"FILL",1,0)=Y
  1. I CNT>0 S ^TMP("PS",$J,INDEX,"FILL",0)=1
  1. I RFL<6 D
  1. .K FILL
  1. .;Patch 1016 add a $G around the node
  1. .S NRXN=$P($G(^PSRX(HIEN,"OR1")),U,3)
  1. .I NRXN'="" D
  1. ..S RX2=$S($D(^PSRX(NRXN,2)):^PSRX(NRXN,2),1:"")
  1. ..D FILOOP(NRXN,RX2)
  1. ..S Y=""
  1. ..F PSIII=0:0 S PSIII=$O(FILL(PSIII)) Q:'PSIII D
  1. ...S X=$P($G(FILL(PSIII)),U,1)
  1. ...I X=0 Q
  1. ...S Z=$$FMTE^XLFDT(X)
  1. ...S Y=Y_Z_" "
  1. ..I Y'="" D
  1. ...S ^TMP("PS",$J,INDEX,"FILLS",0)=1
  1. ...S ^TMP("PS",$J,INDEX,"FILLS",1,0)=Y
  1. Q
  1. FILOOP(RX,RX2) ;
  1. S FILL(9999999-$P(RX2,"^",2))=+$P(RX2,"^",2)_"^"_$S($P(RX2,"^",15):"(R)",1:""),FILLS=+$P(HIEN,"^",9)
  1. F II=0:0 S II=$O(^PSRX(RX,1,II)) Q:'II S FILL(9999999-^PSRX(RX,1,II,0))=+^PSRX(RX,1,II,0)_"^"_$S($P(^(0),"^",16):"(R)",1:"") S RFL=RFL+1
  1. Q