| 1 | ORMPS2 ;SLC/MKB - Process Pharmacy ORM msgs cont ; 1/26/07 11:58am
 | 
|---|
| 2 |  ;;3.0;ORDER ENTRY/RESULTS REPORTING;**94,116,129,134,186,190,195,215,265**;Dec 17, 1997;Build 17
 | 
|---|
| 3 |  ;;Per VHA Directive 2004-038, this routine should not be modified.
 | 
|---|
| 4 |  ;
 | 
|---|
| 5 | FINISHED() ; -- new order [SN^ORMPS] due to finishing?
 | 
|---|
| 6 |  N Y,ORIG,TYPE,ORIG4 S Y=0
 | 
|---|
| 7 |  S ORIG=+$P(ZRX,"|",2),TYPE=$P(ZRX,"|",4),ORIG4=$G(^OR(100,ORIG,4))
 | 
|---|
| 8 |  I ORIG,TYPE="E",ORIG4?1.N1"P"!(ORIG4?1.N1"S") S ORIFN=+ORIG,Y=1
 | 
|---|
| 9 |  Q Y
 | 
|---|
| 10 |  ;
 | 
|---|
| 11 | WPX() ; -- Compare comments in @ORMSG@(NTE) with order ORIFN
 | 
|---|
| 12 |  ;     Returns 1 if different, or 0 if same
 | 
|---|
| 13 |  N NTE,SPINST,Y,I,J,X,X1 S Y=0
 | 
|---|
| 14 |  S NTE=+$$NTE^ORMPS1(21),SPINST=$S(NTE:$P(@ORMSG@(NTE),"|",4),1:"")
 | 
|---|
| 15 |  S I=+$O(^OR(100,+ORIFN,4.5,"ID","COMMENT",0)) I I'>0 S:$L(SPINST) Y=1 G WQ
 | 
|---|
| 16 |  S X=$G(^OR(100,+ORIFN,4.5,I,2,1,0)) ;1st line
 | 
|---|
| 17 |  I '$O(^OR(100,+ORIFN,4.5,I,2,1)) S:X'=SPINST Y=1 G WQ
 | 
|---|
| 18 |  S J=1 F  S J=$O(^OR(100,+ORIFN,4.5,I,2,J)) Q:J'>0  S X1=$G(^(J,0)) D  Q:$L(X)'<240
 | 
|---|
| 19 |  . I ($L(X)+$L(X1)+1)'>240 S X=X_" "_X1 Q
 | 
|---|
| 20 |  . S X=X_" "_$E(X1,1,239-$L(X))
 | 
|---|
| 21 |  S:X'=SPINST Y=1 ;changed
 | 
|---|
| 22 | WQ Q Y
 | 
|---|
| 23 |  ;
 | 
|---|
| 24 | IVX() ; -- Compare ORMSG to Inpt order ORIFN if IV, return 0 if 'diff or 'IV
 | 
|---|
| 25 |  N Y,RXC,DG,OI,PSOI,XC,RATE,ORA,ORB,ORX,I,J,OI0,INST,VOL,STR,UNT
 | 
|---|
| 26 |  S RXC=$$RXC^ORMPS,Y=0 I RXC'>0 Q Y  ;not IV of any kind
 | 
|---|
| 27 |  S DG=+$P($G(^OR(100,+ORIFN,0)),U,11),DG=$P($G(^ORD(100.98,DG,0)),U,3)
 | 
|---|
| 28 |  I DG'="IV RX",DG'="TPN" D  Q Y  ;not fluid
 | 
|---|
| 29 |  . I $P(ZRX,"|",7)'="" S Y=1 Q
 | 
|---|
| 30 |  . I $$NUMADDS^ORMPS1>1 S Y=1 Q
 | 
|---|
| 31 |  . S OI=$$VALUE("ORDERABLE"),PSOI=+$P($G(^ORD(101.43,+OI,0)),U,2)
 | 
|---|
| 32 |  . S XC=@ORMSG@(RXC) I PSOI'=$P(XC,U,4) S Y=1 Q
 | 
|---|
| 33 |  . N X1,X2,X3 S X1=$P(XC,"|",4),X2=$P($P(XC,"|",5),U,5)
 | 
|---|
| 34 |  . S X3=$$VALUE("INSTR") I (X1_X2)'=X3,(X1_" "_X2)'=X3 S Y=1 Q
 | 
|---|
| 35 | IV1 S RATE=$$FIND^ORM(+RXE,24),UNT=$P($$FIND^ORM(+RXE,25),U,5)
 | 
|---|
| 36 |  S:$L(UNT) RATE=RATE_" "_UNT I RATE'=$$VALUE("RATE") S Y=1 Q Y
 | 
|---|
| 37 |  S ORB=+$$PTR("ORDERABLE ITEM"),ORA=+$$PTR("ADDITIVE"),I=+RXC
 | 
|---|
| 38 |  F  S XC=@ORMSG@(I) Q:$E(XC,1,3)'="RXC"  D  S I=$O(@ORMSG@(I)) Q:I'>0
 | 
|---|
| 39 |  . S ORX($P(XC,"|",2),+$P(XC,U,4))=$P(XC,"|",4)_U_$P($P(XC,"|",5),U,5)
 | 
|---|
| 40 |  . ;ORX("A",PSOI)=str^units or ORX("B",PSOI)=volume^units
 | 
|---|
| 41 |  F I="STRENGTH","UNITS","VOLUME" D  ;ORX(I,inst)=value
 | 
|---|
| 42 |  . S J=0 F  S J=$O(^OR(100,+ORIFN,4.5,"ID",I,J)) Q:J'>0  D
 | 
|---|
| 43 |  .. S INST=+$P($G(^OR(100,+ORIFN,4.5,J,0)),U,3)
 | 
|---|
| 44 |  .. S:INST ORX(I,INST)=$G(^OR(100,+ORIFN,4.5,J,1))
 | 
|---|
| 45 |  S I=0 F  S I=$O(^OR(100,+ORIFN,4.5,"ID","ORDERABLE",I)) Q:I'>0  D  Q:Y
 | 
|---|
| 46 |  . S OI0=$G(^OR(100,+ORIFN,4.5,I,0)),OI=+$G(^(1))
 | 
|---|
| 47 |  . S PSOI=+$P($G(^ORD(101.43,OI,0)),U,2)
 | 
|---|
| 48 |  . I $P(OI0,U,2)=ORA,$G(ORX("A",PSOI)) D  Q
 | 
|---|
| 49 |  .. S INST=$P(OI0,U,3),STR=+ORX("A",PSOI),UNT=$P(ORX("A",PSOI),U,2)
 | 
|---|
| 50 |  .. I STR'=$G(ORX("STRENGTH",INST)) S Y=1 Q
 | 
|---|
| 51 |  .. I UNT'=$G(ORX("UNITS",INST)) S Y=1 Q
 | 
|---|
| 52 |  .. K ORX("A",PSOI) ;same
 | 
|---|
| 53 |  . I $P(OI0,U,2)=ORB,$G(ORX("B",PSOI)) D  Q
 | 
|---|
| 54 |  .. S INST=$P(OI0,U,3),VOL=+$G(ORX("B",PSOI))
 | 
|---|
| 55 |  .. I VOL'=$G(ORX("VOLUME",INST)) S Y=1 Q
 | 
|---|
| 56 |  .. K ORX("B",PSOI) ;same
 | 
|---|
| 57 |  . S Y=1
 | 
|---|
| 58 |  I $O(ORX("A",0))!$O(ORX("B",0)) S Y=1 ;leftover items - changed
 | 
|---|
| 59 |  Q Y
 | 
|---|
| 60 |  ;
 | 
|---|
| 61 | CHANGED() ; -- Compare ORMSG to order ORIFN, return 1 if different
 | 
|---|
| 62 |  N X,Y,X1,ZSC,NTE,SIG,PI S Y=0
 | 
|---|
| 63 |  I $G(ORCAT)="I" D  G CHQ
 | 
|---|
| 64 |  . I $$WPX S Y=1 Q  ;Special Instructions
 | 
|---|
| 65 |  . ;S X=$$VALUE("DAYS") ;duration
 | 
|---|
| 66 |  . ;I X S X1=$$DURATION^ORMPS1($P($G(ORQT(1)),U,3)) I X'=X1 S Y=1 Q
 | 
|---|
| 67 |  . I $$IVX S Y=1 Q  ;IV fields
 | 
|---|
| 68 |  S X=$P($P(RXE,"|",3),U,4) I X'=$$VALUE("DRUG") S Y=1 G CHQ
 | 
|---|
| 69 |  I $P(RXE,"|",11)'=$$VALUE("QTY") S Y=1 G CHQ
 | 
|---|
| 70 |  I $P(RXE,"|",13)'=$$VALUE("REFILLS") S Y=1 G CHQ
 | 
|---|
| 71 |  S X=$P(RXE,"|",23) S:$E(X)="D" X=+$E(X,2,99) I X'=$$VALUE("SUPPLY") S Y=1 G CHQ
 | 
|---|
| 72 |  I $P(ZRX,"|",5)'=$$VALUE("PICKUP") S Y=1 G CHQ
 | 
|---|
| 73 |  S NTE=$$NTE^ORMPS1(21),SIG=+$O(^OR(100,+ORIFN,4.5,"ID","SIG",0)) ;verb
 | 
|---|
| 74 |  I NTE,SIG,$P($P(@ORMSG@(NTE),"|",4)," ")'=$P($G(^OR(100,+ORIFN,4.5,SIG,2,1,0))," ") S Y=1 G CHQ
 | 
|---|
| 75 |  S NTE=$$NTE^ORMPS1(7),PI=+$O(^OR(100,+ORIFN,4.5,"ID","PI",0))
 | 
|---|
| 76 |  I (NTE&'PI)!('NTE&PI) Q 1 ;added or deleted
 | 
|---|
| 77 |  I NTE,PI,$P(@ORMSG@(NTE),"|",4)'=$G(^OR(100,+ORIFN,4.5,PI,2,1,0)) S Y=1 G CHQ
 | 
|---|
| 78 |  Q:'$P($G(^OR(100,+ORIFN,8,0)),U,3)
 | 
|---|
| 79 |  N LSTACT,PREPRV,CURPRV S LSTACT="?",(PREPRV,CURPRV)=0
 | 
|---|
| 80 |  F  S LSTACT=$O(^OR(100,+ORIFN,8,LSTACT),-1) Q:LSTACT
 | 
|---|
| 81 |  S PREPRV=$P($G(^OR(100,+ORIFN,8,LSTACT,0)),U,3)
 | 
|---|
| 82 |  S CURPRV=$P($G(ORC),"|",13)
 | 
|---|
| 83 |  I (PREPRV'=CURPRV) S Y=1 G CHQ
 | 
|---|
| 84 | CHQ Q Y
 | 
|---|
| 85 |  ;
 | 
|---|
| 86 | VALUE(ID) ; -- Return value of ID in ^OR(100,+ORIFN,4.5,"ID")
 | 
|---|
| 87 |  N I,Y I '$L($G(ID)) Q ""
 | 
|---|
| 88 |  S I=+$O(^OR(100,+ORIFN,4.5,"ID",ID,0))
 | 
|---|
| 89 |  S Y=$G(^OR(100,+ORIFN,4.5,I,1))
 | 
|---|
| 90 |  Q Y
 | 
|---|
| 91 |  ;
 | 
|---|
| 92 | PTR(X) ; -- Return ptr to prompt OR GTX X
 | 
|---|
| 93 |  Q +$O(^ORD(101.41,"AB","OR GTX "_X,0))
 | 
|---|
| 94 |  ;
 | 
|---|
| 95 | RO ; -- Replacement order (finished)
 | 
|---|
| 96 |  ;
 | 
|---|
| 97 |  N RXO,RXC,ORDIALOG,ORDG,ORPKG,ORDA,ORX,ORSIG,ORP,ZSC,NEWSTS
 | 
|---|
| 98 |  K ^TMP("ORWORD",$J)
 | 
|---|
| 99 |  I '$D(^VA(200,ORNP,0)) S ORERR="Missing or invalid ordering provider" Q
 | 
|---|
| 100 |  I 'RXE S ORERR="Missing or invalid RXE segment" Q
 | 
|---|
| 101 |  S RXO=$$RXO^ORMPS,RXC=$$RXC^ORMPS,ORIFN=+$G(ORIFN)
 | 
|---|
| 102 |  I ORIFN'>0 S ORERR="Missing or invalid order number" Q
 | 
|---|
| 103 |  D @($S(RXC:"IV",$G(ORCAT)="I":"UDOSE",1:"OUT")_"^ORMPS1") Q:$D(ORERR)
 | 
|---|
| 104 |  S ORDA=$$ACTION^ORCSAVE("XX",ORIFN,ORNP,"",ORNOW,ORWHO)
 | 
|---|
| 105 |  I ORDA'>0 S ORERR="Cannot create new order action" Q
 | 
|---|
| 106 | RO1 ; -Update sts of order to active, last action to dc/edit:
 | 
|---|
| 107 |  S ORX=ORDA F  S ORX=+$O(^OR(100,ORIFN,8,ORX),-1) Q:ORX'>0  I $D(^(ORX,0)),$P(^(0),U,15)="" Q  ;ORX=last released action
 | 
|---|
| 108 |  S:ORX $P(^OR(100,ORIFN,8,ORX,0),U,15)=12 ;dc/edit
 | 
|---|
| 109 |  S $P(^OR(100,ORIFN,3),U,7)=ORDA,NEWSTS=$S('$G(ORSTS):0,ORSTS=$P(^(3),U,3):0,1:1) K ^(6)
 | 
|---|
| 110 |  D STATUS^ORCSAVE2(ORIFN,ORSTS):NEWSTS,SETALL^ORDD100(ORIFN):'NEWSTS
 | 
|---|
| 111 |  D DATES^ORCSAVE2(ORIFN,ORSTRT,ORSTOP)
 | 
|---|
| 112 |  D RELEASE^ORCSAVE2(ORIFN,ORDA,ORNOW,ORWHO,ORNATR)
 | 
|---|
| 113 |  ; -If unsigned edit, leave XX unsigned & mark ORX as Sig Not Req'd
 | 
|---|
| 114 |  S ORSIG=$S($P($G(^OR(100,ORIFN,8,ORX,0)),U,4)'=2:1,1:0)
 | 
|---|
| 115 |  D SIGSTS^ORCSAVE2(ORIFN,ORDA):ORSIG,SIGN^ORCSAVE2(ORIFN,,,5,ORX):'ORSIG
 | 
|---|
| 116 | RO2 ; -Update responses, get/save new order text:
 | 
|---|
| 117 |  K ^OR(100,ORIFN,4.5) D RESPONSE^ORCSAVE,ORDTEXT^ORCSAVE1(ORIFN_";"_ORDA)
 | 
|---|
| 118 |  S $P(^OR(100,ORIFN,0),U,5)=ORDIALOG_";ORD(101.41,",$P(^(0),U,14)=ORPKG
 | 
|---|
| 119 |  ;I $P(^OR(100,ORIFN,0),U,11)'=ORDG D  ;update DG,xrefs
 | 
|---|
| 120 |  ;AGP Changes to handle IMO IV orders CPRS 26v43
 | 
|---|
| 121 |  I $P(^OR(100,ORIFN,0),U,11)'=ORDG,$P(^OR(100,ORIFN,0),U,11)'=$O(^ORD(100.98,"B","CLINIC ORDERS","")) D
 | 
|---|
| 122 |  . N DA,DR,DIE
 | 
|---|
| 123 |  . S DA=ORIFN,DR="23////"_ORDG,DIE="^OR(100," D ^DIE
 | 
|---|
| 124 |  S ^OR(100,ORIFN,4)=PKGIFN,$P(^(8,ORDA,0),U,14)=ORDA
 | 
|---|
| 125 |  S ORIFN=ORIFN_";"_ORDA,ORDCNTRL="SN" ;to send NA msg back
 | 
|---|
| 126 |  I $G(ORL) S ORP(1)=ORIFN_"^1" D PRINTS^ORWD1(.ORP,+ORL)
 | 
|---|
| 127 |  I $G(ORCAT)="O" S ZSC=$$ZSC^ORMPS1 I ZSC,$P(ZSC,"|",2)'?2.3U S ^OR(100,+ORIFN,5)=$TR($P(ZSC,"|",2,7),"|","^") ;1 or 0 instead of [N]SC in #100
 | 
|---|
| 128 |  Q
 | 
|---|
| 129 | IVLIM(IVDUR)    ;
 | 
|---|
| 130 |  I $L(IVDUR) D
 | 
|---|
| 131 |  . N DURU,DURV S DURU="",DURV=0
 | 
|---|
| 132 |  . S DURU=$E(IVDUR,1),DURV=$E(IVDUR,2,$L(IVDUR))
 | 
|---|
| 133 |  . I (DURU="D")!(DURU="d") S IVDUR="for "_+DURV_$S(+DURV=1:" day",+DURV>1:" days",1:" day")
 | 
|---|
| 134 |  . I (DURU="H")!(DURU="h") S IVDUR="for "_+DURV_$S(+DURV=1:" hours",+DURV>1:" hours",1:" hour")
 | 
|---|
| 135 |  . I (DURU="M")!(DURU="m") S IVDUR="with total volume "_+DURV_" ml"
 | 
|---|
| 136 |  . I (DURU="L")!(DURU="l") S IVDUR="with total volume "_+DURV_" L"
 | 
|---|
| 137 |  Q IVDUR
 | 
|---|
| 138 | PCOMM ; -- Get Provider Comments from previous order, when changed
 | 
|---|
| 139 |  N OLD,I
 | 
|---|
| 140 |  S OLD=+$G(ORIFN) I OLD<1 S OLD=+$P(ZRX,"|",2) Q:OLD<1
 | 
|---|
| 141 |  S I=+$O(^OR(100,OLD,4.5,"ID","COMMENT",0)) Q:I<1
 | 
|---|
| 142 |  Q:'$O(^OR(100,OLD,4.5,I,2,0))  ;none
 | 
|---|
| 143 |  M ^TMP("ORWORD",$J,PC,1)=^OR(100,OLD,4.5,I,2)
 | 
|---|
| 144 |  S ORDIALOG(PC,1)="^TMP(""ORWORD"",$J,"_PC_",1)"
 | 
|---|
| 145 |  S ORDIALOG(PC,"FORMAT")="@" ;text in Sig already
 | 
|---|
| 146 |  Q
 | 
|---|