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

ORWDXC.m

Go to the documentation of this file.
  1. ORWDXC ; SLC/KCM - Utilities for Order Checking ;Jul 10, 2023@09:25:01
  1. ;;3.0;ORDER ENTRY/RESULTS REPORTING;**10,141,221,243,280,346,345,311,395,269,469,377,539,405,588**;Dec 17, 1997;Build 29
  1. ;Reference to $$ENDCM^PSJORUTL,ENDDIV^PSJORUTL in ICR #2403
  1. ;Reference to DOSE^PSSOPKI1 in ICR #3739
  1. ;Reference to DOSE^PSSORUTL in ICR #3233
  1. ;
  1. ON(VAL) ; returns E if order checking enabled, otherwise D
  1. S VAL=$$GET^XPAR("DIV^SYS^PKG","ORK SYSTEM ENABLE/DISABLE")
  1. Q
  1. FILLID(VAL,DLG) ; Return the FillerID (namespace) for a dialog
  1. N DGRP
  1. S VAL="",DGRP=$P($G(^ORD(101.41,DLG,0)),U,5) Q:'DGRP
  1. S DLG=$$DEFDLG^ORWDXQ(DGRP)
  1. S VAL=$P($G(^ORD(101.41,DLG,0)),U,7),VAL=$$NMSP^ORCD(VAL)
  1. I VAL="PS" D
  1. . N X
  1. . S X=$P($P($G(^ORD(100.98,DGRP,0)),U,3)," ")
  1. . I $L(X) S VAL="PS"_$S(X="UD":"I",1:X)
  1. Q
  1. DISPLAY(LST,DFN,FID) ; Return list of Order Checks for a FillerID (namespace)
  1. N I,ORX,ORY
  1. S ORX=1,ORX(1)="|"_FID
  1. D EN^ORKCHK(.ORY,DFN,.ORX,"DISPLAY")
  1. S I=0 F S I=$O(ORY(I)) Q:I'>0 S LST(I)=$P(ORY(I),U,4)
  1. Q
  1. ALLERGY(LST,DFN,FID,OIL,ORDRNUM,ORL) ; Return list of allergy Order Checks on select medication
  1. ; DFN = Patient IEN
  1. ; FID = PSI (Inpatient)
  1. ; PSO (Outpatient)
  1. ; PSH (Non-VA)
  1. ; OIL = Orderable Item #
  1. ; ORDRNUM = Order # (file 100)
  1. ; ORL = Ordering Location (only passed when being performed on orderable item selection - not required)
  1. I +ORDRNUM,+OIL Q ;Only OIL or ORDRNUM is allowed, not both
  1. S ORL=$G(ORL) I +ORL>0 S ORL=+ORL_";SC"
  1. S FID=$S(FID="PSH":FID,FID="PSX":"PSH",FID="PSO":FID,FID="PSIV":"PSIV",1:"PSI")
  1. K ^TMP($J,"OROCOUTO;"),^TMP($J,"OROCOUTI;"),^TMP($J,"ORDSGCHK_CACHE")
  1. K ^TMP($J,"ORENHCHK")
  1. N X,Y,USID,ORCHECK,ORI,ORX,ORY,%DT,ORDODSG,CNT,RSLT,OILORD,ORALLCHKNM
  1. N ORDRGNAM
  1. S ORALLCHKNM="ORALLERGYCHK"
  1. S OILORD=$S(+OIL:+OIL,1:+ORDRNUM)
  1. K ORX,ORY
  1. I OILORD>0 K ^TMP(ORALLCHKNM,$J,DFN,OILORD)
  1. S ORDRGNAM=""
  1. ; do the ALLERGY order checks
  1. I +OIL D
  1. . N ORDRGNM,ORDRGSM
  1. . D FNDDRUG(.USID,+OIL,DFN,FID)
  1. . S ORDRGSM=1
  1. . I FID="PSX" S FID="PSO"
  1. . S (CNT,ORX)=0
  1. . F S CNT=$O(USID(CNT)) Q:CNT="" D
  1. . . S ORX(CNT)=+OIL_"|"_FID_"|"_USID(CNT)_"|",ORX=ORX+1,ORI=1
  1. . . I ORDRGSM=1 D
  1. . . . S ORDRGNM=$P($G(USID(CNT)),U,5),ORDRGNM=$P(ORDRGNM," ",1)_" "_$P(ORDRGNM," ",3)
  1. . . . I $L($TR(ORDRGNM," ","")) D
  1. . . . . I ORDRGNAM="" S ORDRGNAM=ORDRGNM Q
  1. . . . . I ORDRGNAM'=ORDRGNM S ORDRGSM=0,ORDRGNAM=""
  1. I +ORDRNUM D
  1. . I FID="PSX" S FID="PSO"
  1. . D FNDDRG(.ORX,+ORDRNUM,FID)
  1. . S OIL=ORDRNUM
  1. ;S ORX(1)=+OIL_"|"_FID_"||",(ORX,ORI)=1
  1. D EN^ORKCHK(.ORY,DFN,.ORX,"ALLERGY",.OIL,0)
  1. I $D(ORY) D RETURN^ORCHECK ; expects ORY, ORCHECK
  1. ; return ORCHECK as 1 dimensional list
  1. D FDBDOWN^ORCHECK(0)
  1. D CHK2LST
  1. K ^TMP($J,"OROCOUTO;"),^TMP($J,"OROCOUTI;"),^TMP($J,"DD"),^TMP($J,"ORDSGCHK_CACHE")
  1. I $D(LST) D
  1. . N DATA
  1. . S DATA(1)=OIL_U_FID
  1. . S DATA(2)=FID_U_"ORDERABLE"_U_U_OIL_U_ORDRGNAM
  1. . D CANCEL^ORNORC(.LST,DFN,FID,ORL,.DATA,"") ; TDP add order check data to 100.3
  1. I $D(ORY),OILORD>0 M ^TMP(ORALLCHKNM,$J,DFN,OILORD)=ORY
  1. Q
  1. REASON(LST,TYP,DFN,OID) ;Return list of pre-defined override reasons
  1. N ORRSN,RSNI,RSNTYP,ORDT,ORVP,ORIFN,ORLAST
  1. S ORDT="",ORIFN="",ORVP=DFN_";DPT(",ORLAST=""
  1. I OID D
  1. . F S ORDT=$O(^OR(100,"AOI",OID,ORVP,ORDT),-1) Q:ORDT="" D
  1. . . F S ORIFN=$O(^OR(100,"AOI",OID,ORVP,ORDT,ORIFN)) Q:ORIFN=""!(ORLAST]"") D
  1. . . . Q:'$D(^ORD(100.05,ORIFN,3,1))
  1. . . . S ORLAST=$G(^ORD(100.05,ORIFN,3,1,0))
  1. S ORRSN=0,RSNI=0
  1. I ORLAST]"" S LST($I(RSNI))=ORLAST
  1. F S ORRSN=$O(^ORD(100.04,ORRSN)) Q:'ORRSN D
  1. . S RSNTYP=$P(^ORD(100.04,ORRSN,0),"^",3)
  1. . I RSNTYP="B",TYP="R" Q ;Quit if the reason type is 'B' for Both and the incoming option is 'R' only
  1. . Q:TYP'[RSNTYP&(RSNTYP'="B") ;Otherwise quit if the reason type is not contained in the incoming option AND not 'B'
  1. . Q:$P(^ORD(100.04,ORRSN,0),"^",1)=ORLAST
  1. . S LST($I(RSNI))=$P(^ORD(100.04,ORRSN,0),"^",1)
  1. I 'RSNI S LST(1)="No predefined reasons available"
  1. Q
  1. ACCEPT(LST,DFN,FID,STRT,ORL,OIL,ORIFN,ORREN,ORRENFLDS,ALLACC) ; Return list of Order Checks on Accept Order
  1. K ^TMP($J,"OROCOUTO;"),^TMP($J,"OROCOUTI;"),^TMP($J,"ORDSGCHK_CACHE")
  1. ; OIL(n)=OIptr^PS|PSIV|LR^PkgInfo
  1. ; ORREN - IF ORREN IS SET TO 1 THEN ORIFN IS THE ORDER GETTING RENEWED
  1. K ^TMP($J,"ORENHCHK")
  1. N ACCEPT,X,Y,USID,ORCHECK,ORI,ORX,ORY,%DT,ORDODSG,ORDITM,ORALLCHKNM
  1. ; convert relative start date to real start date
  1. S ORL=ORL_";SC(",X=STRT,STRT="",ORDODSG=0
  1. D:X="AM" AM^ORCSAVE2 D:X="NEXT" NEXT^ORCSAVE2
  1. I $L(X) S %DT="FTX" D ^%DT S:Y'>0 Y="" S STRT=Y
  1. S ACCEPT=$S('+$G(ALLACC):"ACCEPT",1:"ALLACC")
  1. ; do the SELECT order checks
  1. S (ORI,ORX)=0 F S ORI=$O(OIL(ORI)) Q:'ORI D
  1. . Q:'OIL(ORI)
  1. . S USID=$$USID(OIL(ORI))
  1. . S OIL(ORI,"USID")=USID
  1. . S ORX=ORX+1,ORX(ORX)=+OIL(ORI)_"|"_FID_"|"_USID
  1. . S:$P(OIL(ORI),U,2)="PSIV" $P(ORX(ORX),"|",7)=$P($P(OIL(ORI),U,3),";")
  1. D EN^ORKCHK(.ORY,DFN,.ORX,"SELECT",.OIL,.ORDODSG)
  1. I $D(ORY) D RETURN^ORCHECK ; expects ORY, ORCHECK
  1. K ORX,ORY
  1. ; do the ACCEPT order checks
  1. S (ORI,ORX)=0 F S ORI=$O(OIL(ORI)) Q:'ORI D
  1. . Q:'OIL(ORI)
  1. . S ORX=ORX+1
  1. . S ORX(ORX)=+OIL(ORI)_"|"_FID_"|"_OIL(ORI,"USID")_"|"_STRT
  1. . S:$P(OIL(ORI),U,2)="LR" $P(ORX(ORX),"|",6)=$P(OIL(ORI),U,3)
  1. D EN^ORKCHK(.ORY,DFN,.ORX,ACCEPT,.OIL,.ORDODSG)
  1. I $D(ORY) D RETURN^ORCHECK ; expects ORY, ORCHECK
  1. ; return ORCHECK as 1 dimensional list
  1. D FDBDOWN^ORCHECK(0)
  1. D OPOS(DFN)
  1. I '$G(DT) S DT=$$DT^XLFDT
  1. S ORALLCHKNM="ORALLERGYCHK"
  1. S ORDITM=+$P($G(OIL(1)),U,1)
  1. I $D(ORY),ORDITM>0,'$D(^TMP(ORALLCHKNM,$J,DFN,ORDITM)) D
  1. . N ORCNTR
  1. . S ORCNTR=0
  1. . F S ORCNTR=$O(ORY(ORCNTR)) Q:ORCNTR="" D
  1. . . I $P(ORY(ORCNTR),U,2)=3 S ^TMP(ORALLCHKNM,$J,DFN,ORDITM,ORCNTR)=$G(ORY(ORCNTR))
  1. D CHK2LST
  1. D CHECKIT(.LST)
  1. K ^TMP($J,"OROCOUTO;"),^TMP($J,"OROCOUTI;"),^TMP($J,"DD"),^TMP($J,"ORDSGCHK_CACHE")
  1. I $D(LST) D CANCEL^ORNORC(.LST,DFN,FID,ORL,.OIL,STRT) ; ajb add order check data to 100.3
  1. Q
  1. DELAY(LST,DFN,FID,STRT,ORL,OIL) ; Return list of Order Checks on Accept Delayed
  1. K ^TMP($J,"OROCOUTO;"),^TMP($J,"OROCOUTI;"),^TMP($J,"DD"),^TMP($J,"ORDSGCHK_CACHE")
  1. ; OIL(n)=OIptr^PS|PSIV|LR^PkgInfo
  1. N X,Y,ORCHECK,ORI,ORX,ORY,%DT
  1. ; convert relative start date to real start date
  1. S ORL=ORL_";SC(",X=STRT,STRT=""
  1. D:X="AM" AM^ORCSAVE2 D:X="NEXT" NEXT^ORCSAVE2
  1. I $L(X) S %DT="FTX" D ^%DT S:Y'>0 Y="" S STRT=Y
  1. ; do the ACCEPT order checks
  1. S (ORI,ORX)=0 F S ORI=$O(OIL(ORI)) Q:'ORI D
  1. . S ORX=ORX+1
  1. . S ORX(ORX)=+OIL(ORI)_"|"_FID_"|"_$$USID(OIL(ORI))_"|"_STRT
  1. . I $P(OIL(ORI),U,2)="LR" S $P(ORX(ORX),"|",6)=$P(OIL(ORI),U,3)
  1. D EN^ORKCHK(.ORY,DFN,.ORX,"ALL",.OIL)
  1. I $D(ORY) D RETURN^ORCHECK ; expects ORY, ORCHECK
  1. ; return ORCHECK as 1 dimensional list
  1. D CHK2LST
  1. K ^TMP($J,"OROCOUTO;"),^TMP($J,"OROCOUTI;"),^TMP($J,"DD"),^TMP($J,"ORDSGCHK_CACHE")
  1. Q
  1. SESSION(LST,ORVP,ORLST) ; Return list of Order Checks on Release Order
  1. K ^TMP($J,"OROCOUTO;"),^TMP($J,"OROCOUTI;"),^TMP($J,"DD")
  1. N I,ORES,ORCHECK
  1. S ORVP=+ORVP_";DPT("
  1. S I=0 F S I=$O(ORLST(I)) Q:'I D
  1. . I +$P(ORLST(I),";",2)'=1 Q ; order not new
  1. . I $P(ORLST(I),U,3)="0" Q ; order not being released
  1. . S ORES($P(ORLST(I),U))=""
  1. D SESSION^ORCHECK
  1. D OPOS(+ORVP)
  1. D CHK2LST
  1. D CHECKIT(.LST)
  1. K ^TMP($J,"OROCOUTO;"),^TMP($J,"OROCOUTI;"),^TMP($J,"DD")
  1. Q
  1. SAVECHK(OK,ORVP,RSN,LST) ; Save order checks for session
  1. N ORCHECK,ORIFN S OK=1
  1. D LST2CHK
  1. I $L(RSN)>0 S ORCHECK("OK")=RSN
  1. S ORIFN=0 F S ORIFN=$O(ORCHECK(ORIFN)) Q:'ORIFN D OC^ORCSAVE2
  1. Q
  1. SAVEMCHK(OK,ORVP,LST) ; TDP - Save order checks for session with
  1. ; multiple Reasons/Comments
  1. N ORCHECK,ORCOMMENTS,ORREASONS,ORIFN S OK=1
  1. D LST2CHK
  1. S ORIFN=0 F S ORIFN=$O(ORCHECK(ORIFN)) Q:'ORIFN D OC^ORCSAVE2
  1. Q
  1. DELORD(OK,ORIFN) ; ACTUALLY only cancel the order
  1. S OK=1
  1. D ORCAN^ORNORC(+ORIFN,"AC") ; ajb add order data to #100.3
  1. D CANCEL^ORCSAVE2(ORIFN)
  1. Q
  1. USID(ORITMX) ; Return universal svc ID for an orderable item
  1. ; ORITMX = OI^NMSP^PKGINFO
  1. N RSLT,ORDRUG S RSLT=""
  1. I $E($P(ORITMX,U,2),1,2)="PS" D
  1. . I $P(ORITMX,U,2)="PSIV" D
  1. . . N PSOI,TYPE,VOL S VOL=""
  1. . . S PSOI=+$P($G(^ORD(101.43,+ORITMX,0)),U,2)
  1. . . S TYPE=$P($P(ORITMX,U,3),";")
  1. . . I TYPE="B" S VOL=$P($P(ORITMX,U,3),";",2)
  1. . . D ENDDIV^PSJORUTL(PSOI,TYPE,VOL,.ORDRUG)
  1. . . S ORDRUG=+ORDRUG
  1. . E S ORDRUG=+$P(ORITMX,U,3)
  1. . S RSLT=$$ENDCM^PSJORUTL(ORDRUG)
  1. . S RSLT=$P(RSLT,U,3)_"^^99NDF^"_ORDRUG_U_$$NAME50^ORPEAPI(ORDRUG)_"^99PSD"
  1. E S RSLT=$$USID^ORMBLD(+ORITMX)
  1. I +$P(RSLT,U)=0,+($P(RSLT,U,4)=0) S RSLT="" ; has to be null (why?)
  1. Q RSLT
  1. ;
  1. CHK2LST ; creates list that can be passed to broker from ORCHECK array
  1. ; expects ORCHECK to be present and populates LST
  1. D REMDUPS ;similar to REMDUPS^ORCHECK
  1. N ORIFN,ORID,CDL,I,ILST,LASTIFN,RESERVED,ORCHECK2,ORNUM,OLIST,SORT
  1. S ILST=0,LASTIFN=0,RESERVED=0,OLIST=0,SORT=""
  1. S ORIFN="" F S ORIFN=$O(ORCHECK(ORIFN)) Q:ORIFN="" D
  1. . S CDL=0 F S CDL=$O(ORCHECK(ORIFN,CDL)) Q:'CDL D
  1. . . S SORT=$S(+SORT=0:CDL,CDL<+SORT:CDL,1:+SORT)
  1. . . S I=0 F S I=$O(ORCHECK(ORIFN,CDL,I)) Q:'I D
  1. . . . S ORCHECK2(ORIFN,CDL,+ORCHECK(ORIFN,CDL,I),I)=ORCHECK(ORIFN,CDL,I)
  1. . S:SORT'="" SORT(SORT,ORIFN)="",SORT=""
  1. K ORCHECK
  1. S ORIFN="" F S ORIFN=$O(ORCHECK2(ORIFN)) Q:ORIFN="" D
  1. . S CDL=0 F S CDL=$O(ORCHECK2(ORIFN,CDL)) Q:'CDL D
  1. . . S ORNUM=0 F S ORNUM=$O(ORCHECK2(ORIFN,CDL,ORNUM)) Q:'ORNUM D
  1. . . . S I=0 F S I=$O(ORCHECK2(ORIFN,CDL,ORNUM,I)) Q:'I D
  1. . . . . S OLIST=OLIST+1,ORCHECK(ORIFN,CDL,OLIST)=ORCHECK2(ORIFN,CDL,ORNUM,I)
  1. S SORT=0 F S SORT=$O(SORT(SORT)) Q:'SORT D
  1. . S ORIFN="" F S ORIFN=$O(SORT(SORT,ORIFN)) Q:ORIFN="" D
  1. . . S CDL=0 F S CDL=$O(ORCHECK(ORIFN,CDL)) Q:'CDL D
  1. . . . S I=0 F S I=$O(ORCHECK(ORIFN,CDL,I)) Q:'I D
  1. . . . . I LASTIFN'=ORIFN S LASTIFN=ORIFN,RESERVED=ILST+1,ILST=ILST+1 ; saves a spot for the RDI warning at the top of each order's checks
  1. . . . . S ORID=ORIFN I +ORID,(+ORID=ORID) S ORID=ORID_";1"
  1. . . . . I '$P(ORCHECK(ORIFN,CDL,I),U,2) Q ; CDL="" means don't show
  1. . . . . I $P(ORCHECK(ORIFN,CDL,I),U,1)=99 S LST(RESERVED)=ORID_U_ORCHECK(ORIFN,CDL,I) Q ;Put RDI warning at the top of each order's checks
  1. . . . . S ILST=ILST+1,LST(ILST)=ORID_U_ORCHECK(ORIFN,CDL,I)
  1. Q
  1. LST2CHK ; create ORCHECK array from list passed by broker and
  1. ; create ORREASON and ORCOMMENTS arrays from lists passed by broker
  1. N ORIFN,CDL,I,ILST,X S I=0
  1. S ILST="" F S ILST=$O(LST("ORCHECKS",ILST)) Q:$L(ILST)'>0 D
  1. . I $D(LST("ORCHECKS",ILST,0)) D
  1. . . N J S J=0 S X=LST("ORCHECKS",ILST,J) F S J=$O(LST("ORCHECKS",ILST,J)) Q:'J S X=X_LST("ORCHECKS",ILST,J)
  1. . I '$D(LST("ORCHECKS",ILST,0)) S X=LST("ORCHECKS",ILST)
  1. . S ORIFN=$P(X,U),CDL=$P(X,U,3)
  1. . I +$G(ORIFN)>0,+$G(CDL)>0 D ;cla 12/16/03
  1. . . S I=I+1,ORCHECK(+ORIFN,CDL,I)=$P(X,U,2,4)
  1. ;TDP - Added below code to handle Override Reasons
  1. S ILST="" F S ILST=$O(LST("ORREASONS",ILST)) Q:ILST="" D
  1. . ;
  1. . S X=LST("ORREASONS",ILST) ;I $D(LST("ORREASONS",ILST))
  1. . ;. S ILST="" F S ILST=$O(LSTR("ORREASONS",ILST)) Q:$L(ILST)'>0 D
  1. . S ORIFN=+$P(X,U)
  1. . Q:+ORIFN<1
  1. . S ORREASONS(ORIFN)=$P(X,U,2)
  1. ;TDP - Added below code to handle Remote Allergy Comments
  1. S ILST="" F S ILST=$O(LST("ORCOMMENTS",ILST)) Q:ILST="" D
  1. . S X=LST("ORCOMMENTS",ILST)
  1. . S ORIFN=+$P(X,U)
  1. . Q:+ORIFN<1
  1. . S ORCOMMENTS(ORIFN)=$P(LST("ORCOMMENTS",ILST),U,2)
  1. Q
  1. CHECKIT(X) ;remove unnecessary duplication of Duplicate Therapy checks
  1. N I,J,K,Y,Z
  1. S I=0 F S I=$O(X(I)) Q:'I I $P(X(I),U,2)=17 D
  1. .Q:$P($G(^ORD(100.8,17,0)),U)'="DUPLICATE DRUG THERAPY"
  1. .N STR S STR=$P($P(X(I),"{",2),"}")
  1. .N CLASS S CLASS=$P(X(I),"in the same therapeutic categor(ies): ",2)
  1. .S Z(+X(I),I)=CLASS
  1. .S J=0 F S J=J+1 Q:J>$L(STR,", ") D
  1. ..S Y(+X(I),I,J)=$P(STR,", ",J)
  1. S I="" F S I=$O(Y(I)) Q:'$L(I) D
  1. .S J=0 F S J=$O(Y(I,J)) Q:'J D
  1. ..S K=J F S K=$O(Y(I,K)) Q:'K!('$D(Y(I,J))) D
  1. ...N A,B M A=Y(I,J),B=Y(I,K)
  1. ...I $$AINB(.A,.B) D
  1. ....N ADDCLASS S ADDCLASS=$P(Z(I,J),U)
  1. ....K X(J),Y(I,J)
  1. ....I X(K)'[ADDCLASS S X(K)=X(K)_", "_ADDCLASS
  1. ...Q:'$D(Y(I,J))
  1. ...I $$AINB(.B,.A) D
  1. ....N ADDCLASS S ADDCLASS=$P(Z(I,K),U)
  1. ....K X(K),Y(I,K)
  1. ....I X(J)'[ADDCLASS S X(J)=X(J)_", "_ADDCLASS
  1. Q
  1. AINB(A,B) ;if array A is a subset of array B then return 1, else return 0
  1. N I,RET
  1. S RET=1
  1. S I=0 F S I=$O(A(I)) Q:'I I '$$XINA(A(I),.B) S RET=0 Q
  1. Q RET
  1. XINA(X,A) ;if string X is an entry in array A then return 1, else return 0
  1. N I,RET
  1. S RET=0
  1. S I=0 F S I=$O(A(I)) Q:'I I X=A(I) S RET=1 Q
  1. Q RET
  1. REMDUPS ;
  1. N IFN,CDL,I,J,CDL2 S IFN="NEW"
  1. S CDL=0 F S CDL=$O(ORCHECK(IFN,CDL)) Q:'CDL D
  1. . S I=0 F S I=$O(ORCHECK(IFN,CDL,I)) Q:'I D
  1. .. S CDL2=0 F S CDL2=$O(ORCHECK(IFN,CDL2)) Q:'CDL2 D
  1. ... S J=I F S J=$O(ORCHECK(IFN,CDL2,J)) Q:'J I $TR($P($G(ORCHECK(IFN,CDL,I)),U,3),";",",")=$TR($P($G(ORCHECK(IFN,CDL2,J)),U,3),";",",") D
  1. .... I CDL2<=CDL K ORCHECK(IFN,CDL2,J) S ORCHECK=$G(ORCHECK)-1
  1. .... I CDL2>CDL S $P(ORCHECK(IFN,CDL,I),U,7)="X"
  1. .. I $P(ORCHECK(IFN,CDL,I),U,7)="X" K ORCHECK(IFN,CDL,I) S ORCHECK=$G(ORCHECK)-1
  1. Q
  1. REMDUPSX ;similar to REMDUPS^ORCHECK
  1. N IFN,CDL,I,J S IFN="NEW"
  1. S CDL=0 F S CDL=$O(ORCHECK(IFN,CDL)) Q:'CDL D
  1. . S I=0 F S I=$O(ORCHECK(IFN,CDL,I)) Q:'I D
  1. . . S J=I F S J=$O(ORCHECK(IFN,CDL,J)) Q:'J I $G(ORCHECK(IFN,CDL,I))=$G(ORCHECK(IFN,CDL,J)) K ORCHECK(IFN,CDL,J) S ORCHECK=$G(ORCHECK)-1
  1. Q
  1. OPOS(DFN) ;handles saving and removing order checks that should only be displayed once per cprs session
  1. ; expects ORCHECK
  1. ; sets these order checks into the "Once Per cprs Session" global ^TMP($J,"OC-OPOS",DFN)
  1. N I,J,K
  1. S I="" F S I=$O(ORCHECK(I)) Q:'$L(I) D
  1. .S J=0 F S J=$O(ORCHECK(I,J)) Q:'J D
  1. ..S K=0 F S K=$O(ORCHECK(I,J,K)) Q:'K D
  1. ...N ORTXT,ORTXTO,ORTXT0,ORTXTI,ORXTRAI
  1. ...S ORTXTO="These checks could not be completed for this patient:"
  1. ...Q:(ORCHECK(I,J,K)'[ORTXTO)
  1. ...S ORTXT=ORTXTO
  1. ...S ORXTRAI=$P($P(ORCHECK(I,J,K),"||",2),"&")
  1. ...S ORTXTI=0 F S ORTXTI=$O(^TMP($J,"ORK XTRA TXT",ORXTRAI,ORTXTO,ORTXTI)) Q:'ORTXTI D
  1. ....S ORTXT=ORTXT_$G(^TMP($J,"ORK XTRA TXT",ORXTRAI,ORTXTO,ORTXTI))
  1. ...I $D(^TMP($J,"OC-OPOS",DFN,$E(ORTXT,1,225))) K ORCHECK(I,J,K) Q
  1. ...S ^TMP($J,"OC-OPOS",DFN,$E(ORTXT,1,225))="" Q
  1. Q
  1. FNDDRUG(USID,OI,DFN,FID) ;Identify and return potential drug items based on
  1. ; the Orderable Item
  1. N X,RSLT
  1. D OISLCT(.RSLT,OI,$S($G(FID)="PSO":"O",$G(FID)="PSH":"X",$G(FID)="PSIV":"I",1:"U"),DFN)
  1. S X=0 F S X=$O(RSLT(X)) Q:+X=0 D
  1. . S USID(X)=$$DRUG($G(RSLT(X)))
  1. K RSLT
  1. Q
  1. OISLCT(LST,OI,PSTYPE,ORVP) ; Return Dispense Drug IENs ;Modified from OISLCT^ORWDPS2
  1. ;TDP note - PSTYPE needs to be - O:Outpt, U:Unit Dose, I:IV, X:Non-VA Med
  1. N ILST,ORDOSE,ORWPSOI,ORWDOSES,X1,X2
  1. K ^TMP("PSJINS",$J),^TMP("PSJMR",$J),^TMP("PSJNOUN",$J),^TMP("PSJSCH",$J),^TMP("PSSDIN",$J)
  1. S ILST=0
  1. S ORWPSOI=0
  1. S:+OI ORWPSOI=+$P($G(^ORD(101.43,+OI,0)),U,2)
  1. ;D START^PSSJORDF(ORWPSOI,$S(PSTYPE="U":"I",1:"O")) ; dflt route, schedule, etc.
  1. I '$L($T(DOSE^PSSOPKI1)) D DOSE^PSSORUTL(.ORDOSE,ORWPSOI,PSTYPE,ORVP) ; dflt doses
  1. I $L($T(DOSE^PSSOPKI1)) D DOSE^PSSOPKI1(.ORDOSE,ORWPSOI,PSTYPE,ORVP) ; dflt doses NEW PKI CODE from pharmacy
  1. ;
  1. ; Modified from DISPLST^ORWDPS2, set up list of dispense drugs ien
  1. N DD
  1. S DD=0 F S DD=$O(ORDOSE("DD",DD)) Q:'DD D
  1. . S ILST=ILST+1
  1. . S LST(ILST)=DD
  1. Q
  1. DRUG(ORDD) ;Returns 6 ^-piece identifier for Dispense Drug ;Modified from DRUG^ORCHECK
  1. N ORNDF,Y
  1. ;Next line requires work to make it usable. Variables used that are not available, like Order #
  1. ;I ORDG=+$O(^ORD(100.98,"B","IV RX",0)) S ORDD=$$IV^ORCHECK G D1
  1. S ORDD=+ORDD
  1. Q:ORDD=0 "" S ORNDF=$$ENDCM^PSJORUTL(ORDD)
  1. D1 S Y=$P(ORNDF,U,3)_"^^99NDF^"_ORDD_U_$$NAME50^ORPEAPI(ORDD)_"^99PSD"
  1. Q Y
  1. FNDDRG(ORX,ORDER,PKG) ;
  1. N ORI,INST,PTR,ITEM,USID,START,ORDD
  1. S ORI=0
  1. F S ORI=$O(^OR(100,ORDER,4.5,"ID","ORDERABLE",ORI)) Q:ORI'>0 D
  1. . S INST=$P($G(^OR(100,ORDER,4.5,ORI,0)),U,3),PTR=$P($G(^(0)),U,2),ITEM=+$G(^(1))
  1. . ;S USID=$S(PKG?1"PS".E:$$DRUG(ITEM,PTR,ORDER),1:$$USID^ORMBLD(ITEM))
  1. . S ORDD=$O(^OR(100,ORDER,4.5,"ID","DRUG",0)),ORDD=+$G(^OR(100,ORDER,4.5,+ORDD,1))
  1. . S USID=$$DRUG(ORDD)
  1. . S START=$$START^ORCHECK(ORDER)
  1. . ;S SPEC=$S(PKG="LR":$$VALUE^ORCSAVE2(ORDER,"SPECIMEN",INST),1:"")
  1. . ;S ORX=+$G(ORX)+1,ORX(ORX)=ITEM_"|"_PKG_"|"_USID_"|"_START_"|"_ORDER_"|"_SPEC
  1. . S ORX=+$G(ORX)+1,ORX(ORX)=ITEM_"|"_PKG_"|"_USID_"|"_START_"|"_ORDER_"|"
  1. Q
  1. CLRALLGY(ORY,DFN) ;Clears the ^TMP data containing the temporary allergy order checks for a patient
  1. ; DFN = PATIENT IEN
  1. N ORALLCHKNM
  1. S ORALLCHKNM="ORALLERGYCHK"
  1. I +$G(DFN)=0 Q
  1. K ^TMP(ORALLCHKNM,$J,+DFN)
  1. Q