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

PSBPOIV.m

Go to the documentation of this file.
  1. PSBPOIV ;BIRMINGHAM/EFC-IV PARAMETER VALIDATION ;12/7/12 3:39pm
  1. ;;3.0;BAR CODE MED ADMIN;**2,66,70**;Mar 2004;Build 101
  1. ;;Per VHA Directive 2004-038 (or future revisions regarding same), this routine should not be modified.
  1. ;
  1. ; Reference/IA
  1. ; ^DIC(42/2440
  1. ; EN^PSJBCMA2/2830
  1. ; VADPT/10061
  1. ; $$GET^XPAR/2263
  1. ;
  1. ;*70 - Change the way IV Bag parameters are retrieved slightly.
  1. ; If patient is admitted use the Ward to find DIVision IV params
  1. ; If not admitted find DIV associated with the Clinic order and
  1. ; get that DIV IV params. Else use logged in User's DIV.
  1. ;
  1. EN(PSBDFN,PSBORD) ;
  1. ;
  1. S DFN=PSBDFN,(PSBMI,PSBMW,PSBMWC,PSBMAUD)=0,(PSBMIDT,PSBMIM)="",PSBONXS=PSBORD_"^"
  1. K ^TMP("PSBAR",$J) S ^TMP("PSBAR",$J,"W",0)=0
  1. D CLEAN^PSBVT,PSJ1^PSBVT(DFN,PSBORD,1)
  1. ; get IV parameters for the current ward
  1. S PSBCSTR="^ADDITIVE^STRENGTH^BOTTLE^SOLUTION^VOLUME^INFUSION RATE^MED ROUTE^SCHEDULE^ADMIN TIME^REMARKS^OTHER PRINT INFO^PROVIDER^START DATE/TIME^STOP DATE/TIME^PROVIDER COMMENTS"
  1. D INP^VADPT S PSBWARD=$P(VAIN(4),"^"),PSBWDIV=PSBWARD D KVAR^VADPT
  1. I $G(PSBWARD)'="",$D(^PSB(53.66,"B",PSBWARD)) D ; if IV paramaters defined for ward use them
  1. .S PSBWARD=$O(^PSB(53.66,"B",PSBWARD,""))
  1. .S:$D(^PSB(53.66,PSBWARD,1,"B",PSBIVT)) PSBIVPAR=^PSB(53.66,PSBWARD,1,$O(^PSB(53.66,PSBWARD,1,"B",PSBIVT,""),-1),0)
  1. N PSBFLAG,PSBDFLT,PSBORLOC
  1. I ($G(PSBCLORD)]"") D
  1. .N DIC,X,Y S DIC="^SC(",DIC(0)="XZ" S X=PSBCLORD D ^DIC S:(Y>0) PSBORLOC=+Y
  1. ;
  1. ; If IV parameters not defined for Ward or Clinic, then get defaults for division
  1. I '$D(PSBIVPAR) S PSBIVPAR=PSBIVT D
  1. .D:$D(PSBWDIV)!$G(PSBORLOC) ;Get the appropriate DIV for Ward or Clinic and DIVISIONAL IV PARAMETERS
  1. ..S PSBWDIV=$$GET1^DIQ(42,PSBWDIV_",",.015,"I") ;Ward DIV *70
  1. ..I '$G(PSBWARD),$G(PSBORLOC) S PSBWDIV=$$GET1^DIQ(44,PSBORLOC_",",3.5,"I") ;Clinic DIV *70
  1. ..I $G(PSBWDIV)']"" S PSBWDIV="DIV"
  1. ..E S PSBWDIV=$P($$SITE^VASITE(DT,PSBWDIV),U,1),PSBWDIV="DIV.`"_PSBWDIV
  1. ..S PSBDFLT="^I^I^I^I^I^W^I^I^I^I^W^I^I^I^I" ;Set default IV Bag Parameters variable
  1. ..F X=2:1 Q:$P(PSBCSTR,U,X)="" S PSBIVPAR=PSBIVPAR_U_$P($P($$GET^XPAR(PSBWDIV,"PSBIV "_$P(PSBCSTR,U,X),PSBIVT,"B"),U,2),"-",1) I $P(PSBIVPAR,U,X)="" D ;If null, set default - PSB*3*66
  1. ...S $P(PSBIVPAR,U,X)=$P(PSBDFLT,U,X),PSBFLAG="" ;If null, set default - PSB*3*66
  1. ..K PSBWDIV ; Kill temp variable.
  1. ;
  1. F PSBC1=1:1 Q:$P(PSBONXS,U,PSBC1)="" D ; process all orders
  1. .D CLEAN^PSBVT,PSJ1^PSBVT(DFN,$P(PSBONXS,U,PSBC1),1)
  1. .K PSBPONX2 I $G(PSBPONX)]"",$G(PSBPONX)["P" S PSBPONX2=PSBPONX D ; Must compare "active" orders for changes made - look beyond "pendings"
  1. ..F D CLEAN^PSBVT,PSJ1^PSBVT(DFN,PSBPONX2,1) S PSBPONX2=PSBPONX Q:(PSBPONX2="")!(PSBPONX2'["P") ;
  1. ..D CLEAN^PSBVT,PSJ1^PSBVT(DFN,$P(PSBONXS,U,PSBC1),1) ; Refresh data
  1. ..S:$D(PSBPONX2) PSBPONX=PSBPONX2 K PSBPONX2
  1. .Q:($L(U_PSBONXS,U_PSBPONX_U)-1)>0
  1. .I $G(PSBPONX)]"" S PSBONXS=PSBONXS_PSBPONX_U
  1. .K ^TMP("PSJ2",$J) S PSBMAUD=0 D EN^PSJBCMA2(PSBDFN,PSBONX,1) ; check IV parameters against activity log for this order when no "I"nvalid message
  1. .I PSBMI=0 F X=1:1 Q:'$D(^TMP("PSJ2",$J,X)) S PSBCHKV=U_$P(^TMP("PSJ2",$J,X,1),U,3)_U I PSBCSTR[PSBCHKV D MSG(PSBCHKV,$P(^TMP("PSJ2",$J,X,1),U,1)) S PSBMAUD=1
  1. .K ^TMP("PSJ2",$J)
  1. .I PSBMI=0,$G(PSBPONX)]"" D SAVEPAR,CHKORD ; check IV parameters against previous order when no "I"nvalid message
  1. .D CLEAN^PSBVT,PSJ1^PSBVT(DFN,$P(PSBONXS,U,PSBC1),1) ; restore variable for this order
  1. .; okay - we have invalids and warnings through this order so process bags for this order
  1. .I '$D(PSBUIDA) Q ; got errors and warning but no bags printed for this order - go to the next
  1. .S PSBUID="" F S PSBUID=$O(PSBUIDA(PSBUID),-1) Q:PSBUID="" D
  1. ..F PSBC2=1:1 S PSBMONX=$P(PSBONXS,U,PSBC2) Q:PSBMONX="" D ; check if bag is in 53.79
  1. ...I $D(^PSB(53.79,"AUID",PSBDFN,PSBMONX,PSBUID)) D
  1. ....S PSBIEN=$O(^PSB(53.79,"AUID",PSBDFN,PSBMONX,PSBUID,""))
  1. ....S PSBPDT=$P(PSBLBLA(PSBUID),U,1),PSBLSTS=$P(PSBLBLA(PSBUID),3)
  1. ....S $P(X,U,2)=$P(^PSB(53.79,PSBIEN,0),U,9) ; add action status
  1. ....S $P(X,U,3)=$P(^PSB(53.79,PSBIEN,0),U,6) ; add action date/time
  1. ....S $P(X,U,4)=$P(^PSB(53.79,PSBIEN,.1),U,1) ; add order ID was administered for
  1. ..S $P(X,U,5)=PSBONX ; add order ID was printed for
  1. ..S $P(X,U,6)=PSBOSTS ; add order status
  1. ..S $P(X,U,7)=$P(PSBLBLA(PSBUID),U,1) ; add date/time ID was printed
  1. ..S $P(X,U,8)=$P(PSBLBLA(PSBUID),U,3) ; add lable status from pharmacy
  1. ..S $P(X,U,9)="" ; 9 open for later development
  1. ..S $P(X,U,10)=PSBUIDA(PSBUID) ; add return from PSJ1
  1. ..D BWAR
  1. ..I PSBMW=1 S PSBMWS="W;" F I=1:1:^TMP("PSBAR",$J,"W",0) D S $P(X,U,1)=$P(PSBMWS,";",1,$L(PSBMWS,";")-1)
  1. ...I $P(PSBLBLA(PSBUID),U,1)'>$P(^TMP("PSBAR",$J,"W",I),U,2) D
  1. ....S:(PSBONX=$P(PSBONXS,U,1))&(PSBMAUD=1) PSBMWS=PSBMWS_I_";"
  1. ....S:PSBONX'=$P(PSBONXS,U,1) PSBMWS=PSBMWS_I_";"
  1. ..I PSBMIDT'="",$P(PSBLBLA(PSBUID),U,1)<PSBMIDT D
  1. ...S:(PSBONX=$P(PSBONXS,U,1))&(PSBMAUD=1) $P(X,U,1)="I"
  1. ...S:(PSBONX'=$P(PSBONXS,U,1)) $P(X,U,1)="I"
  1. ..S ^TMP("PSBAR",$J,PSBUID)=X K X
  1. D CLEAN^PSBVT
  1. K PSBC1,PSBC2,PSBSCHV,PSBCSTR,PSBIVPAR,PSBMI,PSBMIDT,PSBMIM,PSBMONX,PSBMW,PSBSPAR,PSBUID,PSBWARD
  1. K PSBADA,PSBSOLA,PSBOTMP
  1. I ^TMP("PSBAR",$J,"W",0)=0 K ^TMP("PSBAR",$J,"W",0)
  1. D PSJ1^PSBVT(DFN,PSBORD,1) ; restore variables for calling order
  1. Q
  1. ;
  1. SAVEPAR ; save parameters from current order
  1. K PSBOTMP
  1. I $D(PSBADA) M PSBOTMP("ADD")=PSBADA E S PSBOTMP("ADD")="" ; additive, strength, bottle
  1. I $D(PSBSOLA) M PSBOTMP("SOL")=PSBSOLA E S PSBOTMP("SOL")="" ; solution, volume,
  1. K PSBADA,PSBSOLA
  1. S PSBOTMP("INFUSION RATE")=$G(PSBIFR),PSBOTMP("MED ROUTE")=$G(PSBMR)
  1. S PSBOTMP("SCHEDULE")=$G(PSBSCH),PSBOTMP("ADMIN TIME")=$G(PSBADST)
  1. S PSBOTMP("REMARKS")=$G(PSBRMRK),PSBOTMP("OTHER PRINT INFO")=$G(PSBOTXT)
  1. S PSBOTMP("PROVIDER")=PSBMD,PSBOTMP("START DATE/TIME")=PSBOST
  1. S PSBOTMP("STOP DATE/TIME")=PSBOSP
  1. D CLEAN^PSBVT,PSJ1^PSBVT(DFN,$P(PSBONXS,U,PSBC1+1),1) ; setup previous order variables
  1. Q
  1. ;
  1. CHKORD ; check previous order against current order
  1. I $D(PSBADA)!($D(PSBOTMP("ADD"))) D CHKADD Q:PSBMI=1
  1. I $D(PSBSOLA)!($D(PSBOTMP("SOL"))) D CHKSOL Q:PSBMI=1
  1. I PSBIFR'=PSBOTMP("INFUSION RATE") D MSG("INFUSION RATE",PSBOSP) Q:PSBMI=1
  1. I PSBMR'=PSBOTMP("MED ROUTE") D MSG("MED ROUTE",PSBOSP) Q:PSBMI=1
  1. I PSBSCH'=PSBOTMP("SCHEDULE") D MSG("SCHEDULE",PSBOSP) Q:PSBMI=1
  1. I PSBADST'=PSBOTMP("ADMIN TIME") D MSG("ADMIN TIME",PSBOSP) Q:PSBMI=1
  1. I PSBRMRK'=PSBOTMP("REMARKS") D MSG("REMARKS",PSBOSP) Q:PSBMI=1
  1. I PSBOTXT'=PSBOTMP("OTHER PRINT INFO") D MSG("OTHER PRINT INFO",PSBOSP) Q:PSBMI=1
  1. I PSBMD'=PSBOTMP("PROVIDER") D MSG("PROVIDER",PSBOSP) Q:PSBMI=1
  1. I PSBOTMP("START DATE/TIME")<$$FMADD^XLFDT(PSBOST,,,-1)!(PSBOTMP("START DATE/TIME")>$$FMADD^XLFDT(PSBOST,,,1)) D MSG("START DATE/TIME",PSBOSP) Q:PSBMI=1
  1. ;I $E(PSBOST,1,10)'=$E(PSBOTMP("START DATE/TIME"),1,10) D MSG("START DATE/TIME",PSBOSP) Q:PSBMI=1
  1. I $E(PSBOSP,1,10)'=$E(PSBOTMP("STOP DATE/TIME"),1,10) D MSG("STOP DATE/TIME",PSBOSP)
  1. Q
  1. CHKADD ;
  1. N X,Y
  1. I '$D(PSBADA),'$D(PSBOTMP("ADD")) Q ; no additives
  1. I $O(PSBADA(""),-1)>$O(PSBOTMP("ADD",""),-1) D MSG("ADDITIVE",PSBOSP) Q ;previous order has addtives not in current order
  1. I $O(PSBADA(""),-1)<$O(PSBOTMP("ADD",""),-1) D MSG("ADDITIVE",PSBOSP) Q ;previous order missing additives in current order
  1. S X="" F S X=$O(PSBADA(X)) Q:X="" D Q ; check that additives, strength, and bottle are the same
  1. .I PSBADA(X)=PSBOTMP("ADD",X) Q ; everything the same
  1. .I $P(PSBADA(X),U,2)'=$P(PSBOTMP("ADD",X),U,2) D MSG("ADDITIVE",PSBOSP) Q
  1. .I $P(PSBADA(X),U,4)'=$P(PSBOTMP("ADD",X),U,4) D MSG("STRENGTH",PSBOSP) Q
  1. Q
  1. ;
  1. CHKSOL ;
  1. N X,Y
  1. I '$D(PSBSOLA),'$D(PSBOTMP("SOL")) Q ; no solutions
  1. I $O(PSBSOLA(""),-1)>$O(PSBOTMP("SOL",""),-1) D MSG("SOLUTION",PSBOSP) Q ;previous order has solutions not in current order
  1. I $O(PSBSOLA(""),-1)<$O(PSBOTMP("SOL",""),-1) D MSG("SOLUTION",PSBOSP) Q ;previous order missing solutions in current order
  1. S X="" F S X=$O(PSBSOLA(X)) Q:X="" D Q ; check that solutions volume are the same
  1. .I PSBSOLA(X)=PSBOTMP("SOL",X) Q ; everything the same
  1. .I $P(PSBSOLA(X),U,2)'=$P(PSBOTMP("SOL",X),U,2) D MSG("SOLUTION",PSBOSP) Q
  1. .I $P(PSBSOLA(X),U,4)'=$P(PSBOTMP("SOL",X),U,4) D MSG("VOLUME",PSBOSP) Q
  1. Q
  1. ;
  1. BWAR ;
  1. N X,Y,Z,PSBONX
  1. S X=^TMP("PSBAR",$J,"W",0)+1
  1. S Z="" F Z=1:1 S PSBONX=$P(PSBONXS,U,Z) Q:$G(PSBONX)="" D ; Display "Warning"s for changes
  1. .I '$D(PSBMWAR(PSBONX)) Q
  1. .S Y="" F S Y=$O(PSBMWAR(PSBONX,Y)) Q:Y'?.N1".".N D
  1. ..S Z="",PSBYS="" F S Z=$O(PSBMWAR(PSBONX,Y,Z)) Q:Z="" S PSBYS=PSBYS_Z_";"
  1. ..S PSBYS=$P(PSBYS,";",1,$L(PSBYS,";")-1)
  1. ..S ^TMP("PSBAR",$J,"W",X)=PSBONX_U_Y_U_"2^The "_PSBYS_" was changed on",^TMP("PSBAR",$J,"W",0)=X,X=X+1
  1. .K PSBMWAR(PSBONX)
  1. Q
  1. ;
  1. MSG(PSBMVAR,PSBDATE) ;
  1. ;I PSBMI=1 Q ;already have an invalid don't need anymore - Removed by Patch PSB*3*66 for multiple edits issue.
  1. F Y=1:1 S PSBSPAR=$P(PSBCSTR,U,Y) I PSBSPAR=$TR(PSBMVAR,"^") D Q
  1. .I $P(PSBIVPAR,U,Y)="W" D
  1. ..S PSBMVAR=$TR(PSBMVAR,"^")
  1. ..I PSBMW=0 S PSBMW=1
  1. ..S PSBMWC=PSBMWC+1,PSBMWM="2^The "_PSBSPAR_" has been changed."
  1. ..I $D(PSBMWAR(PSBONX,PSBMVAR)) S PSBOLDT=$O(PSBMWAR(PSBONX,PSBMVAR,"")) I PSBOLDT<$E(PSBDATE,1,12) K PSBMWAR(PSBONX,PSBMVAR,PSBOLDT)
  1. ..S PSBMWAR(PSBONX,PSBMVAR,$E(PSBDATE,1,12))=""
  1. ..S PSBMWAR(PSBONX,$E(PSBDATE,1,12),PSBMVAR)=""
  1. .I $P(PSBIVPAR,U,Y)="I" S PSBMI=1,PSBMIDT=PSBDATE,PSBMIM="-1^IV invalid "_PSBSPAR_".",^TMP("PSBAR",$J,"I")=PSBONX_U_PSBMIDT_U_PSBMIM
  1. Q