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

ORWDX.m

Go to the documentation of this file.
  1. ORWDX ;SLC/KCM,REV,JLI - Order dialog utilities ;Feb 16, 2024@13:21
  1. ;;3.0;ORDER ENTRY/RESULTS REPORTING;**10,85,125,131,132,141,164,178,187,190,195,215,246,243,283,296,280,306,350,424,421,461,490,397,377,539,405,588,601**;Dec 17, 1997;Build 1
  1. ;Per VA Directive 6402, this routine should not be modified.
  1. ;
  1. ;Reference to ^DIC(9.4 in ICR #2058
  1. ;Reference to ^SC( in ICR #10040
  1. ;Reference to ^LAB(60,D0,8,0 in ICR #2387
  1. ;
  1. ORDITM(Y,FROM,DIR,XREF,QOCALL,ACCESS) ; Subset of orderable items
  1. ; Y(n)=IEN^.01 Name^.01 Name -or- IEN^Synonym <.01 Name>^.01 Name
  1. N I,IEN,CNT,X,DTXT,CURTM,DEFROUTE,ORDSTART,CHKLAB,CODE,ORTESTIEN,ORLABOK
  1. N ORLRFILTER
  1. S ORDSTART=$O(^ORD(101.43,XREF,FROM))
  1. S DEFROUTE="",CHKLAB=(XREF="S.LAB")&($L($G(ACCESS))>1)
  1. S ORLRFILTER=$S(XREF="S.LAB":+$$GET^XPAR("SYS","OR LR ORDERABLE ITEM FILTERING",1,"I"),1:0)
  1. S QOCALL=+$G(QOCALL)
  1. S I=0,CNT=44,CURTM=$$NOW^XLFDT
  1. F Q:I'<CNT S FROM=$O(^ORD(101.43,XREF,FROM),DIR) Q:FROM="" D
  1. . S IEN="" F S IEN=$O(^ORD(101.43,XREF,FROM,IEN),DIR) Q:'IEN D
  1. . . S X=^ORD(101.43,XREF,FROM,IEN)
  1. . . I +$P(X,U,3),$P(X,U,3)<CURTM Q
  1. . . I 'QOCALL,$P(X,U,5) Q
  1. . . I QOCALL,$P(X,U,5),FROM'=ORDSTART Q
  1. . . I CHKLAB D I ACCESS'[(U_CODE_U) Q
  1. . . . S CODE=$P($G(^ORD(101.43,IEN,"LR")),U,6)
  1. . . . I CODE="" S CODE="CH"
  1. . . I ORLRFILTER,'$$CHKLABDIV^ORWDX2(IEN,XREF) Q
  1. . . S I=I+1
  1. . . I 'X S Y(I)=IEN_U_$P(X,U,2)_U_$P(X,U,2)
  1. . . E S Y(I)=IEN_U_$P(X,U,2)_$C(9)_"<"_$P(X,U,4)_">"_U_$P(X,U,4)
  1. Q
  1. ;
  1. ODITMBC(Y,XREF,ODLST) ;
  1. N CNT,NM,XRF
  1. S CNT=0,NM=0,XRF=XREF
  1. F S CNT=$O(ODLST(CNT)) Q:'CNT D FNDINFO(.Y,ODLST(CNT))
  1. Q
  1. FNDINFO(Y,ODIEN) ;
  1. D FNDINFO^ORWDX1(.Y,.ODIEN)
  1. Q
  1. DLGDEF(LST,DLG) ; Format mapping for a dlg
  1. D DLGDEF^ORWDX1(.LST,.DLG)
  1. Q
  1. DLGQUIK(LST,QO) ;(NOT USED)
  1. D LOADRSP(.LST,QO)
  1. Q
  1. LOADRSP(LST,RSPID,TRANS,ORREN) ; Load responses from 101.41 or 100
  1. ; RSPID: C123456;1-3243 = cached copy, 134-3234 = cached quick
  1. ; X123456;1 = change order, 134 = quick dialog
  1. ; ORREN: If ORREN is set to 1 then RSPID is the order getting renewed
  1. N I,J,DLG,INST,ID,VAL,ILST,ROOT,ORLOC,ORADDTITRRESP
  1. S ROOT=""
  1. K ^TMP($J,"ORWDX LOADRSP","QO SAVE")
  1. I +RSPID=$P(RSPID,"-",1) D
  1. .S ^TMP($J,"ORWDX LOADRSP","QO SAVE")=+RSPID
  1. I RSPID["-" S ROOT="^TMP(""ORWDXMQ"",$J,"""_RSPID_""")" G XROOT^ORWDX2
  1. I $E(RSPID)="X" D G XROOT^ORWDX2
  1. . N ORIFN
  1. . S ORIFN=+$P(RSPID,"X",2)
  1. . S ROOT="^OR(100,"_ORIFN_",4.5)"
  1. . I $$ISTITR^ORUTL3(ORIFN) D TITR(ORIFN,$G(ORREN),.ROOT,.ORADDTITRRESP)
  1. I +RSPID=RSPID S ROOT="^ORD(101.41,"_+RSPID_",6)" G XROOT^ORWDX2
  1. Q:ROOT=""
  1. G XROOT^ORWDX2
  1. ;
  1. TITR(ORIFN,ORREN,ROOT,ORADDTITRRESP) ; Special handling for outpatient med titration orders
  1. N ORRESPIEN
  1. ;
  1. ; for titration renewals, only renew maintenance portion
  1. I $G(ORREN) D
  1. . S ROOT=$$GETTMP^ORWTITR(ORIFN)
  1. ;
  1. ; when changing an old titration order (pre-v32b/p405), check
  1. ; if it's marked as titrating in back-door, but not in 100
  1. I '$G(ORREN) D
  1. . S ORRESPIEN=$O(^OR(100,ORIFN,4.5,"ID","TITR",0))
  1. . I ORRESPIEN,$D(^OR(100,ORIFN,4.5,+ORRESPIEN,1)) Q
  1. . S ORADDTITRRESP=1 ; add titration response in ORWDX2
  1. Q
  1. ;
  1. SAVE(REC,ORVP,ORNP,ORL,DLG,ORDG,ORIT,ORIFN,ORDIALOG,ORDEA,ORAPPT,ORSRC,OREVTDF,INDICAT) ;
  1. ; ORVP=DFN, ORNP=Provider, ORL=Location, DLG=Order Dialog,
  1. ; ORDG=Display Group, ORIT=Quick Order Dialog, ORAPPT=Appointment
  1. ;
  1. D SAVE^ORWDX3 ;moved to ORWDX3 because of routine size
  1. ;
  1. Q
  1. ;
  1. SENDED(ORWLST,ORIENS,TS,LOC) ; Release EDOs to svc
  1. N OK,ORVP,ORWERR,ORSIGST,ORDA,ORNATURE,ORIX,X,PTEVT,ORIFN,J,EVENT,LOCK,OR3
  1. N ORLR,ORLAB,I ;*539
  1. S ORWERR="",ORIX=0,LOC=LOC_";SC("
  1. ;*539
  1. F I="LR","VBEC" S X=+$O(^DIC(9.4,"C",I,0)) S:X ORLR(X)=1
  1. F S ORIX=$O(ORIENS(ORIX)) Q:'ORIX D Q:ORWERR]""
  1. . S (ORIFN,ORWLST(ORIX))=ORIENS(ORIX)
  1. . S PTEVT=$P(^OR(100,+ORIFN,0),U,17)
  1. . I PTEVT D
  1. .. I $D(EVENT(PTEVT)) S LOCK=1 Q
  1. .. S LOCK=$$LCKEVT^ORX2(PTEVT) S:LOCK EVENT(PTEVT)=""
  1. . I 'LOCK S ORWERR="1^delayed event is locked - another user is processing orders for this event" S ORWLST(ORIX)=ORWLST(ORIX)_"^E^"_ORWERR Q
  1. . S ORDA=$P(ORIFN,";",2) S:'ORDA ORDA=1
  1. . S ORVP=$P($G(^OR(100,+ORIFN,0)),U,2)
  1. . ;*539 Add Protocol Invocation for Lab
  1. . I $G(ORLR(+$P(^OR(100,+ORIFN,0),U,14))),'$G(ORLAB) D
  1. .. I $L($T(BHS^ORMBLD)) D BHS^ORMBLD(ORVP) S ORLAB=1
  1. . I $D(^OR(100,+ORIFN,8,ORDA,0)) D
  1. .. S ORSIGST=$P($G(^(0)),U,4),ORNATURE=$P($G(^(0)),U,12) ;naked references refer to OR(100,+ORIFN,8,ORDA on line above
  1. . S OK=$$LOCK1^ORX2(ORIFN) I 'OK S ORWERR="1^"_$P(OK,U,2)
  1. . I OK,$G(LOCK) D
  1. .. S OR3=$G(^OR(100,+ORIFN,3)) I $P(OR3,"^",3)'=10!($P(OR3,"^",9)]"") D UNLK1^ORX2(ORIENS(ORIX)) Q ;order already released or has a parent
  1. .. S:$G(LOC) $P(^OR(100,+ORIFN,0),U,10)=LOC ;set location
  1. .. S:$G(TS) $P(^OR(100,+ORIFN,0),U,13)=TS ;set specialty
  1. .. D EN2^ORCSEND(ORIENS(ORIX),ORSIGST,ORNATURE,.ORWERR),UNLK1^ORX2(ORIENS(ORIX)) ;add ,LOCK to if statement for 195
  1. . I $L(ORWERR) S ORWLST(ORIX)=ORWLST(ORIX)_"^E^"_ORWERR Q
  1. . E D
  1. .. S PTEVT=$P($G(^OR(100,+ORIENS(ORIX),0)),U,17)
  1. .. D:$$TYPE^OREVNTX(PTEVT)="M" SAVE^ORMEVNT1(ORIENS(ORIX),PTEVT,2)
  1. . S X="RS"
  1. . S $P(ORWLST(ORIX),U,2)=X
  1. I $G(ORLAB) D BTS^ORMBLD(ORVP) ;*539 Finish Protocol Invocation
  1. S J=0 F S J=$O(EVENT(J)) Q:'+J D UNLEVT^ORX2(J) ;195
  1. Q
  1. SEND(ORWLST,DFN,ORNP,ORL,ES,ORWREC) ; Sign
  1. ; DFN=Patient, ORNP=Provider, ORL=Location, ES=Encrypted ES code
  1. ; ORWREC(n)=ORIFN;Action^Signature Sts^Release Sts^Nature of Order
  1. SEND1 N ORVP,ORWI,ORWERR,ORWREL,ORWSIG,ORWNATR,ORDERID,ORBEF,ORLR,ORLAB,X,I
  1. S ORVP=DFN_";DPT(",ORL=ORL_";SC(",ORL(2)=ORL,ORWLST=0
  1. F I="LR","VBEC" S X=+$O(^DIC(9.4,"C",I,0)) S:X ORLR(X)=1
  1. S ORWI=0 F S ORWI=$O(ORWREC(ORWI)) Q:'ORWI D
  1. . S X=ORWREC(ORWI),ORWERR=""
  1. . S ORDERID=$P(X,U),ORWSIG=$P(X,U,2),ORWREL=$P(X,U,3),ORWNATR=$P(X,U,4)
  1. . S ORBEF=0
  1. . I '$D(^OR(100,+ORDERID,0)) Q
  1. . I $D(^OR(100,+ORDERID,8,+$P(ORDERID,";",2),0)) S ORBEF=$P(^OR(100,+ORDERID,8,+$P(ORDERID,";",2),0),U,15)
  1. . S:$D(^OR(100,+ORDERID,8,+$P(ORDERID,";",2),0)) ORWNATR=$S($P(^OR(100,+ORDERID,8,+$P(ORDERID,";",2),0),"^",4)=3:"",1:ORWNATR)
  1. . S ORWERR=$$CHKACT^ORWDXR(ORDERID,ORWSIG,ORWREL,ORWNATR)
  1. . I $L(ORWERR) S ORWERR="1^"_ORWERR
  1. . I '$L(ORWERR) D
  1. .. I $G(ORLR(+$P(^OR(100,+ORDERID,0),U,14))),'$G(ORLAB) D ; lab batch start
  1. ... I $L($T(BHS^ORMBLD)) D BHS^ORMBLD(ORVP) S ORLAB=1
  1. .. N OK S OK=$$LOCK1^ORX2(ORDERID) I 'OK S ORWERR="1^"_$P(OK,U,2)
  1. .. I OK D EN^ORCSEND(ORDERID,"",ORWSIG,ORWREL,ORWNATR,"",.ORWERR),UNLK1^ORX2(ORDERID)
  1. . S ORWLST(ORWI)=ORDERID,X=""
  1. . I $L(ORWERR) S ORWLST(ORWI)=ORWLST(ORWI)_"^E^"_ORWERR Q
  1. . I ORWREL,((ORBEF=10)!(ORBEF=11)),($P(^OR(100,+ORDERID,3),U,3)'=10) S X="R"
  1. . I ORWSIG'=2 S X=X_"S"
  1. . S $P(ORWLST(ORWI),U,2)=X
  1. I $G(ORLAB) D BTS^ORMBLD(ORVP)
  1. I $D(ORWLST)>9 D
  1. . N I,A
  1. . S I=0 F S I=$O(ORWLST(I)) Q:I="" S A=$G(ORWLST(I)) I A["Invalid Procedure, Inactive, no Imaging Type" D SM^ORWDX2(A)
  1. Q
  1. DLGID(VAL,ORIFN) ; return dlg IEN for order
  1. S VAL=$P(^OR(100,+ORIFN,0),U,5)
  1. S VAL=$S($P(VAL,";",2)="ORD(101.41,":+VAL,1:0)
  1. Q
  1. FORMID(VAL,ORIFN) ; Base dlg FormID for an order
  1. N DLG
  1. S VAL=0,DLG=$P(^OR(100,+ORIFN,0),U,5)
  1. Q:$P(DLG,";",2)'="ORD(101.41,"
  1. D FORMID^ORWDXM(.VAL,+DLG)
  1. Q
  1. AGAIN(VAL,DLG) ; return true to keep dlg for another order
  1. S VAL=''$P($G(^ORD(101.41,DLG,0)),U,9)
  1. Q
  1. DGRP(VAL,DLG) ; Display grp pointer for a dlg
  1. S DLG=$S($E(DLG)="`":+$P(DLG,"`",2),1:$O(^ORD(101.41,"AB",DLG,0))) ;kcm
  1. S VAL=$P($G(^ORD(101.41,DLG,0)),U,5)
  1. Q
  1. DGNM(VAL,NM) ; Display grp pointer for name
  1. S VAL=$O(^ORD(100.98,"B",NM,0))
  1. Q
  1. WRLST(LST,LOC) ; List of dlgs for writing orders
  1. G WRLST1^ORWDX1
  1. MSG(LST,IEN) ; Msg text for orderable item
  1. N I
  1. S I=0 F S I=$O(^ORD(101.43,IEN,8,I)) Q:I'>0 S LST(I)=^(I,0)
  1. Q
  1. DISMSG(VAL,IEN) ; Disabled mge for ordering dlg
  1. S VAL=$P($G(^ORD(101.41,+IEN,0)),U,3)
  1. Q
  1. LOCK(OK,DFN) ; Attempt to lock pt for ordering
  1. S OK=$$LOCK^ORX2(DFN)
  1. Q
  1. UNLOCK(OK,DFN) ; Unlock pt for ordering
  1. D UNLOCK^ORX2(DFN) S OK=1
  1. Q
  1. LOCKORD(OK,ORIFN) ; Attempt to lock order
  1. S OK=$$LOCK1^ORX2(ORIFN)
  1. Q
  1. UNLKORD(OK,ORIFN) ; Unlock order
  1. D UNLK1^ORX2(ORIFN) S OK=1
  1. Q
  1. UNLKOTH(OK,ORIFN) ; Unlock pt not by this session
  1. K ^XTMP("ORPTLK-"_ORIFN) S OK=1
  1. Q