| [613] | 1 | PSBVDLIV ;BIRMINGHAM/EFC-BCMA IV VIRTUAL DUE LIST ;Mar 2004
 | 
|---|
 | 2 |  ;;3.0;BAR CODE MED ADMIN;**6,38,32**;Mar 2004;Build 32
 | 
|---|
 | 3 |  ;Per VHA Directive 2004-038 (or future revisions regarding same), this routine should not be modified.
 | 
|---|
 | 4 |  ;
 | 
|---|
 | 5 |  ; Reference/IA
 | 
|---|
 | 6 |  ; EN^PSJBCMA/2828
 | 
|---|
 | 7 |  ; EN^PSJBCMA1/2829 
 | 
|---|
 | 8 |  ;
 | 
|---|
 | 9 | EN(DFN,PSBDT) ; Default Order List Return for Today
 | 
|---|
 | 10 |  ;
 | 
|---|
 | 11 |  ; RPC: PSB GETORDERLIST
 | 
|---|
 | 12 |  ;
 | 
|---|
 | 13 |  ; Description:
 | 
|---|
 | 14 |  ; Returns the current IV order set for today to display on the
 | 
|---|
 | 15 |  ; client VDL
 | 
|---|
 | 16 |  ;
 | 
|---|
 | 17 |  N PSBDATA,PSBTBOUT,PSBDOADD
 | 
|---|
 | 18 |  S PSBTBOUT=0,PSBDOADD=0
 | 
|---|
 | 19 |  S:PSBTAB="IVTAB" PSBDOADD=1
 | 
|---|
 | 20 |  ;
 | 
|---|
 | 21 |  ; Passing PSBDT as 3rd parameter turns off the V.1.0 One-Time lookback
 | 
|---|
 | 22 |  K ^TMP("PSJ",$J),^TMP("PSB",$J,"ON IVTAB") S X1=PSBDT,X2=-3 D C^%DTC S PSBDT2=X D EN^PSJBCMA(DFN,PSBDT2,PSBDT)
 | 
|---|
 | 23 |  ;
 | 
|---|
 | 24 |  I $G(^TMP("PSJ",$J,1,0))=-1 Q  ; No orders
 | 
|---|
 | 25 |  ;
 | 
|---|
 | 26 |  F PSBX=0:0 S PSBX=$O(^TMP("PSJ",$J,PSBX)) Q:('PSBX)!(PSBTBOUT)  D
 | 
|---|
 | 27 |  .D CLEAN^PSBVT,PSJ^PSBVT(PSBX)
 | 
|---|
 | 28 |  .;
 | 
|---|
 | 29 |  .; << Standard checks for ALL orders >>
 | 
|---|
 | 30 |  .;
 | 
|---|
 | 31 |  .Q:PSBONX'["V"  ; IVs only
 | 
|---|
 | 32 |  .Q:PSBIVT["P"  ; No piggybacks
 | 
|---|
 | 33 |  .Q:PSBONX["P"  ;     No Pending Orders
 | 
|---|
 | 34 |  .Q:PSBOST>($$FMADD^XLFDT($$NOW^XLFDT,,,$$GET^XPAR("DIV","PSB ADMIN BEFORE")))
 | 
|---|
 | 35 |  .; Need to see if "last order" in chain is active/not pending.
 | 
|---|
 | 36 |  .S PSBFON1=PSBFON,PSBLOOP=0 I $G(PSBFON)]"" S PSBLACTV=$S($G(PSBFON)["P":0,1:1) S PSBFON2=$G(PSBFON) I 'PSBLACTV F  D  Q:($G(PSBFON)="")!($G(PSBFON1)=$G(PSBFON2))!(PSBLOOP)!(PSBLACTV)  ;
 | 
|---|
 | 37 |  ..I $G(PSBFON)["P" K ^TMP("PSJ1",$J) D EN^PSJBCMA1(DFN,PSBFON2,1) I ^TMP("PSJ1",$J,0)=-1 S PSBFON=""
 | 
|---|
 | 38 |  ..D:$G(PSBFON)["" CLEAN^PSBVT,PSJ1^PSBVT(DFN,PSBFON2)
 | 
|---|
 | 39 |  ..I PSBFON=PSBFON2 S PSBLOOP=1,PSBLACTV=0 Q
 | 
|---|
 | 40 |  ..S PSBLACTV=$S($G(PSBFON)["P":0,$G(PSBFON)']"":PSBLACTV,1:1),PSBFON2=$G(PSBFON)
 | 
|---|
 | 41 |  ..S:(PSBLACTV)&($G(PSBOST)>($$FMADD^XLFDT($$NOW^XLFDT,,,$$GET^XPAR("DIV","PSB ADMIN BEFORE")))) PSBLACTV=0
 | 
|---|
 | 42 |  .D CLEAN^PSBVT,PSJ^PSBVT(PSBX) ;Refresh data
 | 
|---|
 | 43 |  .K PSBCOMP,PSBCOMPX,PSBINFDT,PSBINFST D INFUSING^PSBVDLU2
 | 
|---|
 | 44 |  .D NOW^%DTC
 | 
|---|
 | 45 |  .I ((PSBOSTS="A")!(PSBOSTS="R"))&(PSBOSP<%) S PSBOSTS="E"
 | 
|---|
 | 46 |  .I (PSBOSTS["D")&(PSBCOMP=0) Q  ;     Is it DC'd and not infusing or stopped
 | 
|---|
 | 47 |  .I PSBOSTS="E",PSBCOMP=0 Q  ; Is expired and not infusing or stopped
 | 
|---|
 | 48 |  .I PSBOSTS="D",PSBCOMP=1,($G(PSBFON)]""),PSBLACTV Q  ; order is DC'ed   will be picked up by following order
 | 
|---|
 | 49 |  .I PSBOSTS="E",PSBCOMP=1,($G(PSBFON)]""),PSBLACTV Q  ; order is expired will be picked up by following order
 | 
|---|
 | 50 |  .I PSBOSTS="R",PSBFOR="R",PSBOSP<PSBWBEG Q  ; order is renewed bag picked up by following order
 | 
|---|
 | 51 |  .Q:$G(^TMP("PSB",$J,"ON IVTAB",PSBDFN,PSBONX))=1  ; The "previous order" is displayed on the VDL!
 | 
|---|
 | 52 |  .I (PSBOSTS["E")&(PSBCOMP=0) Q  ;     Is it expired and not infusing
 | 
|---|
 | 53 |  .I PSBIVT["S",PSBISYR=1 Q  ;     No intermittent syringes - done on PB tab
 | 
|---|
 | 54 |  .I PSBIVT["C",PSBISYR=1 Q  ;     No intermittent syringes - done on PB tab
 | 
|---|
 | 55 |  .I PSBIVT["C",PSBCHEMT="P" Q  ;  No Piggyback Chemos
 | 
|---|
 | 56 |  .I PSBNGF&(PSBCOMP=1) Q  ;         Is it marked DO NOT GIVE!
 | 
|---|
 | 57 |  .;
 | 
|---|
 | 58 |  .; Non One-Times with stop date/time < now
 | 
|---|
 | 59 |  .;
 | 
|---|
 | 60 |  .D NOW^%DTC
 | 
|---|
 | 61 |  .I PSBOSP<%,PSBOSTS'="R",PSBCOMP'=1 Q
 | 
|---|
 | 62 |  .;
 | 
|---|
 | 63 |  .; include Active, Renewed, ReInstated and On Call and Hold and Expired infusing
 | 
|---|
 | 64 |  .; (Is it not one time)&(Is it not active or renewed or On Call or Hold)
 | 
|---|
 | 65 |  .Q:PSBSCHT'="O"&((PSBOSTS'="A")&(PSBOSTS'="R")&(PSBOSTS'="RE")&(PSBOSTS'="O")&(PSBOSTS'="D")&(PSBOSTS'="H")&(PSBOSTS'="E"))
 | 
|---|
 | 66 |  .;
 | 
|---|
 | 67 |  .; Is One Time Given
 | 
|---|
 | 68 |  .;
 | 
|---|
 | 69 |  .I PSBSCHT="O" D  Q:PSBGVN
 | 
|---|
 | 70 |  ..S (PSBGVN,X,Y)=""
 | 
|---|
 | 71 |  ..F  S X=$O(^PSB(53.79,"AOIP",DFN,PSBOIT,X),-1) Q:'X  D
 | 
|---|
 | 72 |  ...F  S Y=$O(^PSB(53.79,"AOIP",DFN,PSBOIT,X,Y),-1) Q:'Y  D
 | 
|---|
 | 73 |  ....I $P(^PSB(53.79,Y,.1),U)=PSBON,$P(^PSB(53.79,Y,0),U,9)="G" S PSBGVN=1,(X,Y)=0
 | 
|---|
 | 74 |  .;
 | 
|---|
 | 75 |  .; Is On-Call Given, Can it be given more than once
 | 
|---|
 | 76 |  .;
 | 
|---|
 | 77 |  .I PSBSCHT="OC" D  Q:PSBGVN&('$$GET^XPAR("DIV","PSB ADMIN MULTIPLE ONCALL"))
 | 
|---|
 | 78 |  ..S (PSBGVN,X,Y)=""
 | 
|---|
 | 79 |  ..F  S X=$O(^PSB(53.79,"AOIP",DFN,PSBOIT,X),-1) Q:'X  D
 | 
|---|
 | 80 |  ...F  S Y=$O(^PSB(53.79,"AOIP",DFN,PSBOIT,X,Y),-1) Q:'Y  D
 | 
|---|
 | 81 |  ....I $P(^PSB(53.79,Y,.1),U)=PSBON,$P(^PSB(53.79,Y,0),U,9)="G" S PSBGVN=1,(X,Y)=0
 | 
|---|
 | 82 |  .;
 | 
|---|
 | 83 | OK .S PSBSTRT=PSBOST ; Order Start Date/Time
 | 
|---|
 | 84 |  .S PSBSTOP=PSBOSP ; Order Stop Date/Time
 | 
|---|
 | 85 |  .;
 | 
|---|
 | 86 |  .S PSBREC=""
 | 
|---|
 | 87 |  .S $P(PSBREC,U,1)=DFN ; dfn
 | 
|---|
 | 88 |  .S $P(PSBREC,U,2)=PSBONX ; Order
 | 
|---|
 | 89 |  .S $P(PSBREC,U,3)=+PSBON ; order ien
 | 
|---|
 | 90 |  .S $P(PSBREC,U,4)=PSBOTYP ; iv/ud/pending
 | 
|---|
 | 91 |  .S $P(PSBREC,U,5)=PSBSCHT ; schedule type
 | 
|---|
 | 92 |  .S $P(PSBREC,U,6)=PSBSCH ; schedule
 | 
|---|
 | 93 |  .S Y=""
 | 
|---|
 | 94 |  .S:PSBSM Y="SM"
 | 
|---|
 | 95 |  .S:PSBHSM Y="HSM"
 | 
|---|
 | 96 |  .S $P(PSBREC,U,7)=Y ; self med
 | 
|---|
 | 97 |  .S $P(PSBREC,U,8)=PSBOITX ; drugname
 | 
|---|
 | 98 |  .S $P(PSBREC,U,9)=PSBDOSE_" "_PSBIFR ; dosage
 | 
|---|
 | 99 |  .S $P(PSBREC,U,10)=PSBMR ; med route
 | 
|---|
 | 100 |  .; IV Information Column *new*  -  status date/time
 | 
|---|
 | 101 |  .; (only stopped or infusing)
 | 
|---|
 | 102 |  .;
 | 
|---|
 | 103 |  .D:PSBCOMP 
 | 
|---|
 | 104 |  ..S $P(PSBREC,U,11)=PSBINFDT K PSBINFDT
 | 
|---|
 | 105 |  ..S PSBSTUS=PSBINFST,$P(PSBREC,U,20)=PSBSTUS K PSBINFST
 | 
|---|
 | 106 |  .S $P(PSBREC,U,14)="" ; admin date inserted below
 | 
|---|
 | 107 |  .S $P(PSBREC,U,15)=PSBOIT ; OI Pointer
 | 
|---|
 | 108 |  .S $P(PSBREC,U,16)=PSBNJECT  ;Set injectable med route flag
 | 
|---|
 | 109 |  .; Variable dosage entered as ####-####?
 | 
|---|
 | 110 |  .I $P(PSBREC,U,9)?1.4N1"-"1.4N.E S $P(PSBREC,U,17)=1
 | 
|---|
 | 111 |  .E  S $P(PSBREC,U,17)=0
 | 
|---|
 | 112 |  .S $P(PSBREC,U,18)=PSBIVT  ;IV TYPE
 | 
|---|
 | 113 |  .S $P(PSBREC,U,21)=PSBOST
 | 
|---|
 | 114 |  .S $P(PSBREC,U,22)=PSBOSTS
 | 
|---|
 | 115 |  .S $P(PSBREC,U,26)=PSBSTOP
 | 
|---|
 | 116 |  .S $P(PSBREC,U,27)=$$LASTG^PSBCSUTL(DFN,PSBOIT)
 | 
|---|
 | 117 |  .;
 | 
|---|
 | 118 |  .; Gather Dispense Drugs
 | 
|---|
 | 119 |  .D NOW^%DTC
 | 
|---|
 | 120 |  .S (PSBDDS,PSBSOLS,PSBADDS)="0"
 | 
|---|
 | 121 |  .F Y=0:0 S Y=$O(PSBDDA(Y)) Q:'Y  D
 | 
|---|
 | 122 |  ..Q:$P(PSBDDA(Y),U,4)&($P(PSBDDA(Y),U,4)<%)  ; Inactive
 | 
|---|
 | 123 |  ..S:$P(PSBDDA(Y),U,3)="" $P(PSBDDA(Y),U,3)=1
 | 
|---|
 | 124 |  ..S PSBDDS=PSBDDS_U_$P(PSBDDA(Y),U,1,3)
 | 
|---|
 | 125 |  ..S $P(PSBDDS,U,1)=PSBDDS+1
 | 
|---|
 | 126 |  .; On-Call One Time PRN orders
 | 
|---|
 | 127 |  .S PSBQRR=0
 | 
|---|
 | 128 |  .I "^O^OC^P^"[(U_PSBSCHT_U) D  Q
 | 
|---|
 | 129 |  ..I 'PSBDOADD S PSBTBOUT=1,^TMP("PSB",$J,"IVTAB",0)=2,^TMP("PSB",$J,"IVTAB",1)=1,^TMP("PSB",$J,"IVTAB",2)=1 Q
 | 
|---|
 | 130 |  ..D ADD^PSBVDLU1(PSBREC,PSBOTXT,PSBNOW\1,PSBDDS,PSBSOLS,PSBADDS,"IVTAB")
 | 
|---|
 | 131 |  ..S:$G(PSBFON)'="" ^TMP("PSB",$J,"ON IVTAB",PSBDFN,PSBFON)=1  ; Now do not have to place "following order" on VDL!
 | 
|---|
 | 132 |  .;
 | 
|---|
 | 133 |  .; IV's - don't worry about admin times if blank
 | 
|---|
 | 134 |  .I PSBONX["V",PSBIVT'="P",PSBADST="" D  Q
 | 
|---|
 | 135 |  ..I 'PSBDOADD S PSBTBOUT=1,^TMP("PSB",$J,"IVTAB",0)=2,^TMP("PSB",$J,"IVTAB",1)=1,^TMP("PSB",$J,"IVTAB",2)=1 Q
 | 
|---|
 | 136 |  ..D ADD^PSBVDLU1(PSBREC,PSBOTXT,PSBNOW\1_".",PSBDDS,PSBSOLS,PSBADDS,"IVTAB")
 | 
|---|
 | 137 |  ..S:$G(PSBFON)'="" ^TMP("PSB",$J,"ON IVTAB",PSBDFN,PSBFON)=1  ; Now do not have to place "following order" on VDL!
 | 
|---|
 | 138 |  .;
 | 
|---|
 | 139 |  .; Now we deal with only continuous
 | 
|---|
 | 140 |  .; process admintimes
 | 
|---|
 | 141 |  .S PSBFREQ=$$GETFREQ^PSBVDLU1(DFN,PSBONX)
 | 
|---|
 | 142 |  .S PSBADMIN=PSBADST
 | 
|---|
 | 143 |  .; process admin times against beginning and ending date
 | 
|---|
 | 144 |  .; build all orders for both days.
 | 
|---|
 | 145 |  .F PSBY=1:1 Q:$P(PSBADMIN,"-",PSBY)=""  D
 | 
|---|
 | 146 |  ..; apply this time to the beginning window date
 | 
|---|
 | 147 |  ..S PSB=+(PSBWBEG\1_"."_$P(PSBADMIN,"-",PSBY))
 | 
|---|
 | 148 |  ..D:(PSB'<PSBWBEG)&(PSB'>PSBWEND)  ; Make sure it is in the window
 | 
|---|
 | 149 |  ...D:(PSB'<PSBSTRT)&(PSB<PSBSTOP)  ; Make sure this time is active
 | 
|---|
 | 150 |  ....D:$$OKAY^PSBVDLU1(PSBSTRT,$P(PSB,"."),PSBSCH,PSBON,PSBOITX,PSBFREQ)  ; Okay on this date?
 | 
|---|
 | 151 |  .....I 'PSBDOADD S PSBTBOUT=1,^TMP("PSB",$J,"IVTAB",0)=2,^TMP("PSB",$J,"IVTAB",1)=1,^TMP("PSB",$J,"IVTAB",2)=1 Q
 | 
|---|
 | 152 |  .....D ADD^PSBVDLU1(PSBREC,PSBOTXT,PSB,PSBDDS,PSBSOLS,PSBADDS,"IVTAB")
 | 
|---|
 | 153 |  .....S:$G(PSBFON)'="" ^TMP("PSB",$J,"ON IVTAB",PSBDFN,PSBFON)=1  ; Now do not have to place "following order" on VDL!
 | 
|---|
 | 154 |  ..;
 | 
|---|
 | 155 |  ..Q:(PSBWBEG\1)=(PSBWEND\1)  ; Window only has one day rare but possible
 | 
|---|
 | 156 |  ..;
 | 
|---|
 | 157 |  ..; apply this time to the ending window date
 | 
|---|
 | 158 |  ..S PSB=+(PSBWEND\1_"."_$P(PSBADMIN,"-",PSBY))
 | 
|---|
 | 159 |  ..D:(PSB'<PSBWBEG)&(PSB'>PSBWEND)  ; Make sure it is in the window
 | 
|---|
 | 160 |  ...D:(PSB'<PSBSTRT)&(PSB<PSBSTOP)  ; Make sure this time is active
 | 
|---|
 | 161 |  ....D:$$OKAY^PSBVDLU1(PSBSTRT,$P(PSB,"."),PSBSCH,PSBON,PSBOITX,PSBFREQ)  ; Okay on this date?
 | 
|---|
 | 162 |  .....I 'PSBDOADD S PSBTBOUT=1,^TMP("PSB",$J,"IVTAB",0)=2,^TMP("PSB",$J,"IVTAB",1)=1,^TMP("PSB",$J,"IVTAB",2)=1 Q
 | 
|---|
 | 163 |  .....D ADD^PSBVDLU1(PSBREC,PSBOTXT,PSB,PSBDDS,PSBSOLS,PSBADDS,"IVTAB")
 | 
|---|
 | 164 |  .....S:$G(PSBFON)'="" ^TMP("PSB",$J,"ON IVTAB",PSBDFN,PSBFON)=1  ; Now do not have to place "following order" on VDL!
 | 
|---|
 | 165 |  K ^TMP("PSB",$J,"ON IVTAB")
 | 
|---|
 | 166 |  ;
 | 
|---|
 | 167 |  ;add initials of verifying pharmacist/verifying nurse
 | 
|---|
 | 168 |  D:PSBDOADD VNURSE^PSBVDLU1("IVTAB")
 | 
|---|
 | 169 |  Q
 | 
|---|
 | 170 |  ;
 | 
|---|