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

VPRSDAP.m

Go to the documentation of this file.
  1. VPRSDAP ;SLC/MKB -- SDA Pharmacy utilities ;10/25/18 15:29
  1. ;;1.0;VIRTUAL PATIENT RECORD;**8,24,14,28,30**;Sep 01, 2011;Build 9
  1. ;;Per VHA Directive 6402, this routine should not be modified.
  1. ;
  1. ; External References DBIA#
  1. ; ------------------- -----
  1. ; ^%ZOSF 10096
  1. ; ^DIC(42 10039
  1. ; ^OR(100 5771
  1. ; ^ORD(100.98 6982
  1. ; ^ORD(101.43 2843
  1. ; ^PSB(53.79 5909
  1. ; ^SC 10040
  1. ; DILFD 2055
  1. ; DIQ 2056
  1. ; ORX8 2467
  1. ; PSN50P41 4531
  1. ; PSO52API 4820
  1. ; PSO5241 4821
  1. ; PSOORRL, ^TMP("PS",$J) 2400
  1. ; PSS50 4533
  1. ; PSS50P7 4662
  1. ; PSS51P1 4546
  1. ; PSS52P6 4549
  1. ; PSS52P7 4550
  1. ; PSSUTLA1 3373
  1. ; PSXOPUTL 2200
  1. ; XLFSTR 10104
  1. ;
  1. PS1(IEN) ; -- set up single medication
  1. ; Returns ORIFN, ORPK, PSTYPE & VPRPS=^TMP
  1. N X,CLS S ORIFN=+$G(IEN)
  1. S ORPK=$G(^OR(100,ORIFN,4)) S:'DFN DFN=+$P($G(^(0)),U,2)
  1. ; last char = PS file
  1. S X=$S(ORPK:$E(ORPK,$L(ORPK)),1:"Z") S:X=+X X="R",ORPK=ORPK_X
  1. S CLS=$S("RSN"[X:"O",1:"I") ;"UV"[X:"I",1:$$GET1^DIQ(100,IEN_",",10,"I"))
  1. S PSTYPE=$S(X="N":"N","RS"[X:"O",$$IV:"V",1:"I") K VPRATE
  1. D:ORPK OEL^PSOORRL(DFN,ORPK_";"_CLS)
  1. S VPRPS=$NA(^TMP("PS",$J))
  1. ; ck Status field
  1. S X=$P($G(@VPRPS@(0)),U,6) D
  1. . S:X="DISCONTINUE" X="DISCONTINUED"
  1. . I X["/" S:X["/PARK" X=$P(X,"/") S:X["/SUSP" X="SUSPENDED"
  1. S $P(@VPRPS@(0),U,6)=X
  1. Q
  1. ;
  1. OI(IEN) ; -- return orderable item for order IEN in the format
  1. ; ifn ^ [name] ^ pkg id
  1. N Y S Y=""
  1. I $P($G(^OR(100,IEN,.1,0)),U,4)>1 D ;use PSOI from api if multiple
  1. . N X,I S X=$P($G(@VPRPS@(0)),U)
  1. . S I=0 F S I=$O(^OR(100,IEN,.1,"B",I)) Q:I<1 Q:$P($G(^ORD(101.43,I,0)),U)[X
  1. . S:I Y=I_U_X_U_$P($G(^ORD(101.43,I,0)),U,2)
  1. I 'Y S Y=$$OI^ORX8(IEN) ;first/only
  1. Q Y
  1. ;
  1. SCHEDULE() ; -- return schedule name ^ type ^ admin times ^ #min
  1. ; Expects ORIFN, IEN from VPR DOSAGE STEP
  1. N SCH,ADM,FREQ,I,Y S Y=""
  1. ; Outpt/NonVA only need Schedule
  1. I "ON"[$G(PSTYPE) S Y=$$VALUE^ORX8(ORIFN,"SCHEDULE",IEN) Q Y
  1. S I=+$O(@VPRPS@("SCH",0)),Y=$P($G(@VPRPS@("SCH",I,0)),U,1,2)
  1. S I=+$O(@VPRPS@("ADM",0)),ADM=$G(@VPRPS@("ADM",I,0))
  1. S SCH=$P(Y,U),$P(Y,U,3)=ADM I SCH="" Q ""
  1. I '$D(^TMP("VPRX",$J,"SCH","B",SCH)) D
  1. . D ZERO^PSS51P1(,SCH,"PSJ",,"SCH")
  1. . M ^TMP("VPRX",$J,"SCH")=^TMP($J,"SCH")
  1. . K ^TMP($J,"SCH")
  1. S I=0 F S I=$O(^TMP("VPRX",$J,"SCH",I)) Q:I<1 I $L(ADM),$G(^(I,1))=ADM S $P(Y,U,4)=$G(^(2))
  1. Q Y
  1. ;
  1. LOC(DFN,ID) ; -- return Hosp Location for order
  1. N X,Y,FN
  1. S DFN=+$G(DFN),ID=$G(ID) I 'DFN!'ID Q ""
  1. I '$L($T(LOC^PSSUTLA1)) Q ""
  1. S X=$$LOC^PSSUTLA1(DFN,ID),FN=+$P(X,U,3)
  1. I X,FN=44 Q +X
  1. I X,FN=42 Q +$G(^DIC(42,+X,44))
  1. Q ""
  1. ;
  1. IMO(X,PS) ; -- return true, false, or null if IMO location X
  1. N Y S Y=""
  1. I $G(PS)'="I",$G(PS)'="V" Q ""
  1. S Y=$S($P($G(^SC(+$G(X),0)),U,25):"true",1:"false")
  1. Q Y
  1. ;
  1. PSRX(RX) ; -- get RX info for extension properties
  1. S RX=$G(RX),VPRX52=$NA(^TMP($J,"VPRX",DFN,+RX))
  1. S VPRX52P=$NA(^TMP($J,"VPRXP",DFN,+RX))
  1. Q:$G(PSTYPE)'="O"
  1. I RX["S" D PEN^PSO5241(DFN,"VPRXP",+RX) Q
  1. Q:RX'["R" ;Rx file
  1. D RX^PSO52API(DFN,"VPRX",+RX,,3)
  1. ; get IB data too
  1. D RX^PSO52API(DFN,"VPRXIB",+RX,,"I^O")
  1. M @VPRX52=^TMP($J,"VPRXIB",DFN,+RX) K ^TMP($J,"VPRXIB",DFN,+RX)
  1. Q
  1. ;
  1. ROUTING(RX) ; -- get the Routing value [not in use]
  1. N X,Y S (X,Y)="",RX=$G(RX)
  1. I $G(ORPK)["R" S X=$P($G(@VPRPS@("RXN",0)),U,3)
  1. I $G(ORPK)["S" S X=$P($G(@VPRX52P@(19)),U)
  1. S:$L(X) Y=$S(X="M":"MAIL",X="W":"WINDOW",X="C":"ADMINISTERED IN CLINIC",X="P":"PARK",1:"")
  1. Q Y
  1. ;
  1. GETFILLS ; -- build DLIST(#)=#^data of fills, where data is
  1. ; date ^ daysSupply ^ qty ^ released ^ routing ^ remarks ^ returned
  1. N I,N S N=0
  1. N RX0,RXN S RX0=$G(@VPRPS@(0)),RXN=$G(@VPRPS@("RXN",0))
  1. I $P(RXN,U,6) D ;original fill
  1. . N X S X=$P(RXN,U,6)_U_$P(RX0,U,7,8)_U_$P(RXN,U,7)_U_$P(RXN,U,3)
  1. . S:$G(@VPRX52@(32.1)) $P(X,U,7)=$P(@VPRX52@(32.1),U)
  1. . S N=N+1,DLIST(N)="0^"_X
  1. S I=0 F S I=$O(@VPRPS@("REF",I)) Q:I<1 S N=N+1,DLIST(N)=I_U_$G(@VPRPS@("REF",I,0))
  1. S I=0 F S I=$O(@VPRPS@("PAR",I)) Q:I<1 S N=N+1,DLIST(N)="P"_I_U_$G(@VPRPS@("PAR",I,0))
  1. Q
  1. ;
  1. SUPPLY(IEN) ; -- return 1 or 0, if supply item
  1. N Y S Y=$S($G(^TMP("VPRX",$J,"PSOI",+$G(PSOI),.09)):"true",1:"false")
  1. Q Y
  1. ;
  1. CMOP(RX) ; -- return CMOP indicator for RX
  1. N Y S Y="",RX=+$G(RX)
  1. I $$GET1^DIQ(52,RX,"6:213","I") S Y=">"
  1. N X S X="PSXOPUTL" X ^%ZOSF("TEST") K X I $T D
  1. . N DA,PSXZ S DA=RX D ^PSXOPUTL
  1. . S X=$G(PSXZ(PSXZ("L"))) I X=0!(X=2) S Y="T"
  1. Q Y
  1. ;
  1. SIG(IEN) ; -- return Sig, append VPRPI if needed
  1. N Y S Y=$$WP^VPRSDAOR(+$G(IEN),"SIG")
  1. I $L(Y),$L($G(VPRPI)),Y'[VPRPI D ;append PI?
  1. . N SIG,PI S SIG=$$UP^XLFSTR(Y)
  1. . S PI=$$UP^XLFSTR(VPRPI),PI=$$TRIM^XLFSTR(PI) Q:SIG[PI
  1. . S Y=SIG_$S($E(Y,$L(Y))=" ":"",1:" ")_PI
  1. Q Y
  1. ;
  1. DOSEFORM(IEN) ; -- return dose form
  1. N Y S Y=""
  1. I +$G(PSOI),'$D(^TMP("VPRX",$J,"PSOI",PSOI)) D
  1. . D ZERO^PSS50P7(PSOI,,,"PSOI")
  1. . M ^TMP("VPRX",$J,"PSOI",PSOI)=^TMP($J,"PSOI",PSOI)
  1. . K ^TMP($J,"PSOI",PSOI)
  1. S Y=$G(^TMP("VPRX",$J,"PSOI",+$G(PSOI),.02)) S:Y Y=Y_"^VA50.606"
  1. Q Y
  1. ;
  1. INGRD(NAME) ; -- reset NAME to ingredient IEN
  1. ; Also return VPRCODE=code^name^system
  1. N IEN S IEN=""
  1. S NAME=$G(NAME),VPRCODE=""
  1. I $L(NAME) D
  1. . D NAME^PSN50P41(NAME,"VPRDI") S IEN=+$O(^TMP($J,"VPRDI","P",NAME,0))
  1. . K ^TMP($J,"VPRDI")
  1. I IEN<1 S DDEOUT=1 Q
  1. S VPRCODE=IEN_U_NAME,NAME=IEN ;reset, if passed by reference
  1. D CODE(.VPRCODE,50.416)
  1. Q
  1. ;
  1. NDF(DRUG) ; -- return VA Drug Product info for DRUG (#50 ien)
  1. ; also returns DATA = code^name^system for RXN/VUID
  1. I '$D(^TMP("VPRX",$J,"NDF",DRUG)) D
  1. . D NDF^PSS50(DRUG,,,,,"NDF")
  1. . M ^TMP("VPRX",$J,"NDF",DRUG)=^TMP($J,"NDF",DRUG)
  1. . K ^TMP($J,"NDF",DRUG)
  1. S VPRVAP=$NA(^TMP("VPRX",$J,"NDF",DRUG))
  1. S DATA=$G(^TMP("VPRX",$J,"NDF",DRUG,22)) I DATA D ;#50.68
  1. . D CODE(.DATA,50.68)
  1. . S $P(DATA,U,2)=$P($G(@VPRVAP@(22)),U,2) ;RXN text unreliable
  1. . S:'$L($P(DATA,U,3)) $P(DATA,U,3)="VA50.68"
  1. I 'DATA S DATA=DRUG_U_$G(@VPRVAP@(.01))_"^VA50"
  1. Q
  1. ;
  1. CODE(MED,FILE) ; -- convert MED=ien^name to national code
  1. ; Reset MED = code^name^system for RxNorm or VUID
  1. N Y S MED=$G(MED),FILE=+$G(FILE)
  1. S Y=$$CODE^VPRSDA(+MED,FILE,"RXN")
  1. I Y="" S Y=$$VUID^VPRD(+MED,FILE) S:$L(Y) Y=Y_U_$P(MED,U,2)_"^VHAT"
  1. S:$L(Y) MED=Y ;reset to nat'l code string
  1. Q
  1. ;
  1. DOSES(IEN) ; -- build DLIST(n)=instance of Dose Instructions
  1. N DA,I S IEN=+$G(IEN)
  1. S DA=0 F S DA=$O(^OR(100,IEN,4.5,"ID","INSTR",DA)) Q:DA<1 D
  1. . S I=+$P($G(^OR(100,IEN,4.5,DA,0)),U,3)
  1. . S:I DLIST(I)=I
  1. ; look for NVA w/schedule (dose not required)
  1. I '$O(DLIST(0)),$G(PSTYPE)="N",$O(^OR(100,IEN,4.5,"ID","SCHEDULE",0)) S DLIST(1)=1
  1. Q
  1. ;
  1. BCMA(IEN,MAX) ; -- get list of most recent administrations for order
  1. N ORPK,ADT,DA,CNT,STS
  1. S IEN=+$G(IEN),CNT=0,ADT=9999999,MAX=$G(MAX,10)
  1. I $G(DFN)<1 S DFN=+$P($G(^OR(100,IEN,0)),U,2) Q:'DFN
  1. S ORPK=$G(^OR(100,IEN,4)) Q:ORPK=""
  1. F S ADT=$O(^PSB(53.79,"AORDX",DFN,ORPK,ADT),-1) Q:ADT<1 D Q:CNT'<MAX
  1. . S DA=0 F S DA=+$O(^PSB(53.79,"AORDX",DFN,ORPK,ADT,DA)) Q:DA<1 D
  1. .. ;I $P($G(^PSB(53.79,DA,0)),U,9)="RM" Q ;REMOVED
  1. .. S CNT=CNT+1,DLIST(CNT)=DA
  1. Q
  1. ;
  1. PSB ; -- VPR PSB EVENTS protocol listener (BCMA)
  1. N IEN,DFN,ORPK,ORIFN
  1. S IEN=$S($P($G(PSBIEN),",",2)'="":+$P(PSBIEN,",",2),$G(PSBIEN)="+1":+$G(PSBIEN(1)),1:+$G(PSBIEN))
  1. S DFN=+$G(^PSB(53.79,IEN,0)),ORPK=$P($G(^(.1)),U)
  1. Q:DFN<1 Q:ORPK<1
  1. S ORIFN=$$PLACER^PSSUTLA1(DFN,ORPK)
  1. D:ORIFN POST^VPRHS(DFN,"Medication",+ORIFN_";100")
  1. Q
  1. ;
  1. ADMSTS(DA) ; -- return the code^name of administration status
  1. N X,Y,Z,Z0 S DA=+$G(DA)
  1. S Y=$P($G(PSB0),U,9),X="" I Y="N" D
  1. . S Z="" F S Z=$O(^PSB(53.79,DA,.9,Z),-1) Q:'Z S Z0=$G(^(Z,0)) D Q:$L(X)
  1. .. S X=$P(Z0,U,4) Q:X=""
  1. .. S Y=$S(X="REMOVED":"RM",1:$E(X))
  1. I X="" S X=$$EXTERNAL^DILFD(53.79,.09,,Y)
  1. S:$L(X) Y=Y_U_X
  1. Q Y
  1. ;
  1. IV() ; -- Return 1 or 0, if order is for IV/infusion
  1. I ORPK["V" Q 1
  1. N X0,X S X0=$G(^OR(100,ORIFN,0))
  1. I +$P(X0,U,5)=130 Q 1
  1. S X=$P($G(^ORD(100.98,+$P(X0,U,11),0)),U,3)
  1. I X?1"IV".E Q 1
  1. I X="CI RX" Q 1
  1. ;I $G(^TMP("PS",$J,"A",0))!$G(^TMP("PS",$J,"B",0)) Q 1
  1. Q 0
  1. ;
  1. IVMEDS(IEN) ; -- build DLIST(#)=ien^amount^type[^bottle] for components
  1. N CNT,GBL,I,Y,ND
  1. S ORPK=$G(ORPK),CNT=0
  1. S GBL=$S(ORPK["P":"^PS(53.1,",ORPK["U":"^PS(55,DFN,5,",1:"^PS(55,DFN,""IV"",")
  1. F I=0:0 S I=$O(@(GBL_+ORPK_",""SOL"","_I_")")) Q:'I D
  1. . S ND=$G(@(GBL_+ORPK_",""SOL"","_I_",0)"))
  1. . S CNT=CNT+1,DLIST(CNT)=+ND_U_$P(ND,U,2)_"^B"
  1. F I=0:0 S I=$O(@(GBL_+ORPK_",""AD"","_I_")")) Q:'I D
  1. . S ND=$G(@(GBL_+ORPK_",""AD"","_I_",0)")),Y=+ND_U_$P(ND,U,2)_"^A"
  1. . S:$L($P(ND,U,3)) Y=Y_U_$P(ND,U,3)
  1. . S CNT=CNT+1,DLIST(CNT)=Y
  1. Q
  1. ;
  1. IV1(X) ; -- get VA Drug Product info for IV component X (from DLIST)
  1. ; Returns VPRPSIV = ien^name^amt^type^bottle#
  1. N IEN,TYPE,NAME,DRUG
  1. S VPRPSIV=$G(X) ;ien^amt^type[^bottle#] from IVMEDS
  1. S IEN=+VPRPSIV,TYPE=$P(VPRPSIV,U,3)
  1. D:TYPE="B" ZERO^PSS52P7(IEN,"","","VPRPSIV")
  1. D:TYPE="A" ZERO^PSS52P6(IEN,"","","VPRPSIV")
  1. S NAME=$G(^TMP($J,"VPRPSIV",IEN,.01)),DRUG=+$G(^(1))
  1. S VPRPSIV=IEN_U_NAME_U_$P(VPRPSIV,U,2,99)
  1. S X=+$G(DRUG) D:DRUG NDF^VPRSDAP(DRUG) ;#50 ien
  1. I 'DRUG D ;return IV file instead
  1. . S DATA=IEN_U_NAME_U_$S(TYPE="A":"VA52.6",TYPE="B":"VA52.7",1:"VA")
  1. . S VPRVAP=$NA(^TMP("VPRX",$J,"NDF",0))
  1. K ^TMP($J,"VPRPSIV")
  1. Q
  1. ;
  1. IVRATE(IEN) ; -- return IV Rate, or DDEOUT if invalid
  1. ; also VPRATE = numeric amount, if ## ml/hr
  1. I $G(PSTYPE)'="V" S DDEOUT=1 Q ""
  1. N X S IEN=+$G(IEN)
  1. S X=$$VALUE^ORX8(IEN,"RATE")
  1. I X?1.N1" ml/hr".E S VPRATE=+X Q +X
  1. S DDEOUT=1
  1. Q ""
  1. ;
  1. IVTYPE(IEN) ; -- return IV Type, or DDEOUT if invalid
  1. I $G(PSTYPE)'="V" S DDEOUT=1 Q ""
  1. N X,Y,ORPK,FN,FLD,IENS
  1. S IEN=+$G(IEN),Y="",ORPK=$G(^OR(100,IEN,4))
  1. I ORPK["P" S FN=53.1,FLD=53,IENS=+ORPK
  1. E S FN=55.01,FLD=.04,IENS=+ORPK_","_DFN
  1. S Y=$$GET1^DIQ(FN,IENS_",",FLD)
  1. Q Y