| 1 | ORMPS ; SLC/MKB - Process Pharmacy ORM msgs ;12/3/03  10:32 | 
|---|
| 2 | ;;3.0;ORDER ENTRY/RESULTS REPORTING;**3,54,62,86,92,94,116,138,152,141,165,149,213,195**;Dec 17, 1997 | 
|---|
| 3 | ; | 
|---|
| 4 | EN ; -- entry point | 
|---|
| 5 | I '$L($T(@ORDCNTRL)) Q  ;S ORERR="Invalid order control code" Q | 
|---|
| 6 | I ORDCNTRL'="SN",ORDCNTRL'="ZC",ORDCNTRL'="ZP",'ORIFN!('$D(^OR(100,+ORIFN,0))) S ORERR="Invalid OE/RR order number" Q | 
|---|
| 7 | N ORSTS,RXE,ZRX,ORWHO,ORNOW | 
|---|
| 8 | S ORSTS=$$STATUS(ORDSTS),RXE=$$RXE,ZRX=$$ZRX D QT^ORMPS1 ;QT in RXE | 
|---|
| 9 | S ORNOW=+$E($$NOW^XLFDT,1,12),ORWHO=+$P(ZRX,"|",6) S:'ORWHO ORWHO=DUZ | 
|---|
| 10 | S:ORLOG ORLOG=+$E(ORLOG,1,12) ;no seconds | 
|---|
| 11 | S:'$L(ORNATR) ORNATR=$P(ZRX,"|",3) S:OREASON["^" OREASON=$P(OREASON,U,5) | 
|---|
| 12 | I ORNATR="D",'$L(OREASON) S OREASON="DUPLICATE" | 
|---|
| 13 | D @ORDCNTRL | 
|---|
| 14 | Q | 
|---|
| 15 | ; | 
|---|
| 16 | ZV ; -- Verified | 
|---|
| 17 | N ORUSR,ORVER,ORDA,ORES,ORI | 
|---|
| 18 | S ORUSR=+$P(ORC,"|",12),ORVER="N" Q:'ORUSR | 
|---|
| 19 | S ORDA=+$P($G(^OR(100,+ORIFN,3)),U,7),ORES(+ORIFN_";"_ORDA)="" | 
|---|
| 20 | Q:$P($G(^OR(100,+ORIFN,8,ORDA,0)),U,8)  ;already verified | 
|---|
| 21 | D REPLCD^ORCACT1 ;get unverified replaced orders | 
|---|
| 22 | S ORI="" F  S ORI=$O(ORES(ORI)) Q:ORI=""  D | 
|---|
| 23 | . S ORDA=+$P(ORI,";",2) | 
|---|
| 24 | . D VERIFY^ORCSAVE2(+ORI,ORDA,"N",ORUSR,ORLOG) | 
|---|
| 25 | Q | 
|---|
| 26 | ; | 
|---|
| 27 | ZP ; -- Purged | 
|---|
| 28 | Q:'ORIFN  Q:'$D(^OR(100,+ORIFN,0)) | 
|---|
| 29 | K ^OR(100,+ORIFN,4) I "^3^5^6^15^"[(U_$P($G(^(3)),U,3)_U) D STATUS^ORCSAVE2(+ORIFN,14) ;Remove pkg reference, sts=lapsed if still active | 
|---|
| 30 | Q | 
|---|
| 31 | ; | 
|---|
| 32 | ZR ; -- Purged as requested [ack] | 
|---|
| 33 | D DELETE^ORCSAVE2(+ORIFN) | 
|---|
| 34 | Q | 
|---|
| 35 | ; | 
|---|
| 36 | ZU ; -- Unable to purge [ack] | 
|---|
| 37 | S $P(^OR(100,+ORIFN,3),U)=$$NOW^XLFDT ;update Last Activity | 
|---|
| 38 | Q | 
|---|
| 39 | ; | 
|---|
| 40 | XR ; -- Changed as requested [ack] | 
|---|
| 41 | N ORIG S ORIG=$P(^OR(100,+ORIFN,3),U,5) I ORIG,$P(^OR(100,ORIG,3),U,3)'=12 D STATUS^ORCSAVE2(ORIG,12) | 
|---|
| 42 | OK ; -- Order accepted, PS order # assigned [ack] | 
|---|
| 43 | S ^OR(100,+ORIFN,4)=PKGIFN ;PS identifier | 
|---|
| 44 | D:ORSTS STATUS^ORCSAVE2(+ORIFN,ORSTS) | 
|---|
| 45 | Q | 
|---|
| 46 | ; | 
|---|
| 47 | ZC ; -- convert orders | 
|---|
| 48 | N RXO,RXC,ORDIALOG,ORDG,ORPKG,ORP,ORSIG,ORIG,TYPE,EVNT | 
|---|
| 49 | I '$D(^VA(200,ORDUZ,0)) S ORERR="Missing or invalid entering person" Q | 
|---|
| 50 | I '$D(^VA(200,ORNP,0)) S ORERR="Missing or invalid ordering provider" Q | 
|---|
| 51 | I 'RXE S ORERR="Missing or invalid RXE segment" Q | 
|---|
| 52 | S RXO=$$RXO,RXC=$$RXC K ^TMP("ORWORD",$J) | 
|---|
| 53 | D @($S(RXC:"IV",$G(ORCAT)="I":"UDOSE",1:"OUT")_"^ORMPS1") | 
|---|
| 54 | ZC1 ; continue | 
|---|
| 55 | Q:$D(ORERR)  I 'ORIFN!('$D(^OR(100,+ORIFN,0))) D  Q  ;create | 
|---|
| 56 | . K ORIFN D SN1 Q:'$G(ORIFN)  S ORDCNTRL="SN" | 
|---|
| 57 | . I ORSTOP,ORSTOP<ORNOW S $P(^OR(100,ORIFN,3),U)=ORSTOP | 
|---|
| 58 | S ORIFN=+ORIFN D RESPONSE^ORCSAVE K ^TMP("ORWORD",$J) | 
|---|
| 59 | S ^OR(100,ORIFN,4)=PKGIFN,$P(^(0),U,5)=+ORDIALOG_";ORD(101.41," | 
|---|
| 60 | D DATES^ORCSAVE2(ORIFN,ORSTRT,ORSTOP),STATUS^ORCSAVE2(ORIFN,ORSTS):ORSTS | 
|---|
| 61 | Q | 
|---|
| 62 | ; | 
|---|
| 63 | SN ; -- New backdoor order, return OE# via NA msg | 
|---|
| 64 | I $$FINISHED^ORMPS2 D RO^ORMPS2 Q  ;change action instead | 
|---|
| 65 | N RXO,RXC,ORDIALOG,ORDG,ORPKG,ORP,ORSIG,ORIG,TYPE,EVNT,ZSC | 
|---|
| 66 | I '$D(^VA(200,ORDUZ,0)) S ORERR="Missing or invalid entering person" Q | 
|---|
| 67 | I '$D(^VA(200,ORNP,0)) S ORERR="Missing or invalid ordering provider" Q | 
|---|
| 68 | ; I '$G(ORL) S ORERR="Missing or invalid patient location" Q | 
|---|
| 69 | I 'RXE S ORERR="Missing or invalid RXE segment" Q | 
|---|
| 70 | S RXO=$$RXO,RXC=$$RXC K ^TMP("ORWORD",$J),ORIFN | 
|---|
| 71 | D @($S(RXC:"IV",$G(ORCAT)="I":"UDOSE",1:"OUT")_"^ORMPS1") Q:$D(ORERR) | 
|---|
| 72 | SN1 ; save order | 
|---|
| 73 | D EN^ORCSAVE I '$G(ORIFN) S ORERR="Cannot create new order" G SNQ | 
|---|
| 74 | D BDOSTR^ORWDBA3 ;DG1 & ZCL data | 
|---|
| 75 | S ORIG=+$P(ZRX,"|",2),TYPE=$P(ZRX,"|",4) I ORIG D  ;set fwd/bwd ptrs | 
|---|
| 76 | . S TYPE=$S(TYPE="R":2,1:1) Q:'$D(^OR(100,ORIG,0)) | 
|---|
| 77 | . S $P(^OR(100,ORIFN,3),U,5)=ORIG,$P(^(3),U,11)=TYPE | 
|---|
| 78 | . S $P(^OR(100,ORIG,3),U,6)=ORIFN,EVNT=$P(^(0),U,17) | 
|---|
| 79 | . I $L(EVNT),TYPE=1 S $P(^OR(100,ORIFN,0),U,17)=EVNT | 
|---|
| 80 | . I TYPE=2,$G(ORCAT)="I" S ORSTRT=ORLOG D PARENT^ORMPS3 ;ck if complex | 
|---|
| 81 | 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 | 
|---|
| 82 | SN2 D DATES^ORCSAVE2(ORIFN,ORSTRT,ORSTOP) | 
|---|
| 83 | D:ORSTS STATUS^ORCSAVE2(ORIFN,ORSTS) | 
|---|
| 84 | D RELEASE^ORCSAVE2(ORIFN,1,ORLOG,ORDUZ,ORNATR) | 
|---|
| 85 | ; if unsigned edit, leave ORIFN unsigned & mark ORIG as Sig Not Req'd | 
|---|
| 86 | S ORSIG=$S('ORIG:1,TYPE'=1:1,$P($G(^OR(100,ORIG,8,1,0)),U,4)'=2:1,1:0) | 
|---|
| 87 | D SIGSTS^ORCSAVE2(ORIFN,1):ORSIG,SIGN^ORCSAVE2(ORIG,,,5,1):'ORSIG | 
|---|
| 88 | I ORDCNTRL="SN" D  ;print | 
|---|
| 89 | . S:ORNATR="" $P(^OR(100,ORIFN,8,1,0),U,12)="" ;CHCS/OP orders | 
|---|
| 90 | . S ORP(1)=ORIFN_";1"_$S(ORNATR="":"^^^^1",$G(ORL):"^1",1:"") | 
|---|
| 91 | . I ORP(1)["^" D PRINTS^ORWD1(.ORP,+$G(ORL)) | 
|---|
| 92 | S ^OR(100,ORIFN,4)=PKGIFN | 
|---|
| 93 | SNQ K ^TMP("ORWORD",$J) | 
|---|
| 94 | Q | 
|---|
| 95 | ; | 
|---|
| 96 | XX ; -- Changed (new order not necessary) | 
|---|
| 97 | Q:$P($G(^OR(100,+ORIFN,3)),U,3)=5  ;pending - update when finished | 
|---|
| 98 | I '$$CHANGED^ORMPS2 D SC Q  ;ck sts/dates only | 
|---|
| 99 | RO ; -- Replacement order (finished) | 
|---|
| 100 | S:ORNATR="" ORNATR="S" D RO^ORMPS2 | 
|---|
| 101 | Q | 
|---|
| 102 | ; | 
|---|
| 103 | SC ; -- Status changed (verified, expired, suspended, renewed, reinstate) | 
|---|
| 104 | N OR0,OR3,ZSC,DONE S OR0=$G(^OR(100,+ORIFN,0)),OR3=$G(^(3)) | 
|---|
| 105 | I $P(OR3,U,3)=5,ORSTS=6 D  Q:$G(DONE) | 
|---|
| 106 | . I $$CHANGED^ORMPS2 S ORNATR="S" D RO^ORMPS2 S DONE=1 Q | 
|---|
| 107 | . I $P(ZRX,"|",7)="TPN",+$P(OR0,U,11)'=$O(^ORD(100.98,"B","TPN",0)) D | 
|---|
| 108 | .. N DA,DR,DIE,ORDG S ORDG=+$O(^ORD(100.98,"B","TPN",0)) | 
|---|
| 109 | .. S DA=+ORIFN,DR="23////"_ORDG,DIE="^OR(100," D ^DIE | 
|---|
| 110 | . I $P(OR3,U,11)=2,$P(OR0,U,12)="I" S ORSTRT=+$P($G(^OR(100,+ORIFN,8,1,0)),U,16) ;use Release Date for inpt renewals | 
|---|
| 111 | I $P(OR0,U,12)="I",$P(ZRX,"|",4)="R",+$P(ZRX,"|",2)=+ORIFN S ORSTRT=$P(OR0,U,8) ;keep orig start when renewed | 
|---|
| 112 | D DATES^ORCSAVE2(+ORIFN,ORSTRT,ORSTOP) | 
|---|
| 113 | D:ORSTS STATUS^ORCSAVE2(+ORIFN,ORSTS) | 
|---|
| 114 | I ORSTS=$P(OR3,U,3),ORSTOP'=$P(OR0,U,9) D SETALL^ORDD100(+ORIFN) ;AC xrf | 
|---|
| 115 | S ^OR(100,+ORIFN,4)=PKGIFN | 
|---|
| 116 | I "^1^13^"[(U_$P(OR3,U,3)_U),"^3^5^6^15^"[(U_ORSTS_U) D  ;reinstated | 
|---|
| 117 | . I $P($G(^OR(100,+ORIFN,8,+$P(OR3,U,7),0)),U,2)="DC" S ^(2)=ORNOW_U_ORWHO ; When^Who reinstated order | 
|---|
| 118 | . S I="?" F  S I=$O(^OR(100,+ORIFN,8,I),-1) Q:'+I  I $P(^(I,0),U,15)="" S $P(^OR(100,+ORIFN,3),U,7)=I Q  ;138 Finds current action | 
|---|
| 119 | . K ^OR(100,+ORIFN,6) D SETALL^ORDD100(+ORIFN) | 
|---|
| 120 | 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 | 
|---|
| 121 | Q | 
|---|
| 122 | ; | 
|---|
| 123 | STATUS(X) ; -- HL7 order status | 
|---|
| 124 | N Y S Y=$S(X="IP":5,X="CM":6,X="DC":1,X="ZE":7,X="HD":3,X="ZX":11,X="RP":12,X="ZZ":15,X="ZS":6,X="ZU":6,1:"") | 
|---|
| 125 | Q Y | 
|---|
| 126 | ; | 
|---|
| 127 | DE ; -- Data Errors | 
|---|
| 128 | Q | 
|---|
| 129 | ; | 
|---|
| 130 | UA ; -- Unable to accept [ack] | 
|---|
| 131 | UX ; -- Unable to change [ack] | 
|---|
| 132 | S:'$L(ORNATR) ORNATR="X" ;Rejected | 
|---|
| 133 | S ^OR(100,+ORIFN,6)=$O(^ORD(100.02,"C",ORNATR,0))_U_U_ORNOW_U_U_OREASON | 
|---|
| 134 | I $P($G(^OR(100,+ORIFN,3)),U,11)=2 N ORIG S ORIG=$P(^(3),U,5) S:ORIG $P(^OR(100,ORIG,3),U,6)="" ;remove fwd ptr if pending renewal | 
|---|
| 135 | D STATUS^ORCSAVE2(+ORIFN,13) | 
|---|
| 136 | UC ; -- Unable to cancel [ack] | 
|---|
| 137 | UD ; -- Unable to discontinue [ack] | 
|---|
| 138 | UH ; -- Unable to hold [ack] | 
|---|
| 139 | UR ; -- Unable to release hold [ack] | 
|---|
| 140 | N ORDA S ORDA=+$P(ORIFN,";",2) I ORDA D | 
|---|
| 141 | . S $P(^OR(100,+ORIFN,8,ORDA,0),U,15)=13 ;request rejected | 
|---|
| 142 | . S:$L(OREASON) ^OR(100,+ORIFN,8,ORDA,1)=OREASON | 
|---|
| 143 | Q | 
|---|
| 144 | ; | 
|---|
| 145 | OC ; -- Cancelled (before pharmacist's verification) | 
|---|
| 146 | G:ORTYPE="ORR" UA S:ORNATR="A" ORWHO="" | 
|---|
| 147 | S:'ORSTS ORSTS=13 S:ORSTS=12 ORNATR="S" | 
|---|
| 148 | S ^OR(100,+ORIFN,6)=$S($L(ORNATR):$O(^ORD(100.02,"C",ORNATR,0)),1:"")_U_ORWHO_U_ORNOW_U_U_OREASON | 
|---|
| 149 | I $P($G(^OR(100,+ORIFN,3)),U,11)=2 N ORIG S ORIG=$P(^(3),U,5) S:ORIG $P(^OR(100,ORIG,3),U,6)="" ;remove fwd ptr when pending renewal cancelled | 
|---|
| 150 | S ^OR(100,+ORIFN,4)=PKGIFN S:ORSTOP>ORNOW ORSTOP=ORNOW | 
|---|
| 151 | D UPDATE(ORSTS,"DC") | 
|---|
| 152 | Q | 
|---|
| 153 | ; | 
|---|
| 154 | CR ; -- Cancelled [ack] | 
|---|
| 155 | D STATUS^ORCSAVE2(+ORIFN,13) S ^OR(100,+ORIFN,4)=PKGIFN | 
|---|
| 156 | Q | 
|---|
| 157 | ; | 
|---|
| 158 | OD ; -- Discontinued (cancelled after pharmacist's verification) | 
|---|
| 159 | S:'ORSTS ORSTS=1 S:ORSTS=12 ORNATR="C" | 
|---|
| 160 | I ORNATR="A" S ORWHO="" I $G(DGPMT)=3,$$MVT^DGPMOBS(DGPMDA) D XTMP^ORMEVNT ;save order# | 
|---|
| 161 | S ^OR(100,+ORIFN,6)=$S($L(ORNATR):$O(^ORD(100.02,"C",ORNATR,0)),1:"")_U_ORWHO_U_ORNOW_U_U_OREASON | 
|---|
| 162 | S ^OR(100,+ORIFN,4)=PKGIFN S:ORSTOP>ORNOW ORSTOP=ORNOW | 
|---|
| 163 | D UPDATE(ORSTS,"DC") | 
|---|
| 164 | Q | 
|---|
| 165 | ; | 
|---|
| 166 | DR ; -- Discontinued [ack] | 
|---|
| 167 | D STATUS^ORCSAVE2(+ORIFN,1) S ^OR(100,+ORIFN,4)=PKGIFN | 
|---|
| 168 | Q | 
|---|
| 169 | ; | 
|---|
| 170 | OH ; -- Held | 
|---|
| 171 | S:'ORSTS ORSTS=3 D UPDATE(ORSTS,"HD") | 
|---|
| 172 | Q | 
|---|
| 173 | ; | 
|---|
| 174 | HR ; -- Held [ack] | 
|---|
| 175 | D STATUS^ORCSAVE2(+ORIFN,3) | 
|---|
| 176 | Q | 
|---|
| 177 | ; | 
|---|
| 178 | RL ; -- Released hold | 
|---|
| 179 | OE ; -- Released hold | 
|---|
| 180 | N ORDA S ORDA=+$P(^OR(100,+ORIFN,3),U,7) | 
|---|
| 181 | I $P($G(^OR(100,+ORIFN,8,ORDA,0)),U,2)="HD" S $P(^(2),U,1,2)=ORNOW_U_ORWHO | 
|---|
| 182 | S:'$G(ORSTS) ORSTS=6 D UPDATE(ORSTS,"RL") | 
|---|
| 183 | Q | 
|---|
| 184 | ; | 
|---|
| 185 | OR ; -- Released / [ack] | 
|---|
| 186 | S:'ORSTS ORSTS=6 D STATUS^ORCSAVE2(+ORIFN,ORSTS) | 
|---|
| 187 | D:ORSTRT!ORSTOP DATES^ORCSAVE2(+ORIFN,ORSTRT,ORSTOP) | 
|---|
| 188 | Q | 
|---|
| 189 | ; | 
|---|
| 190 | UPDATE(ORSTS,ORACT) ; -- continue | 
|---|
| 191 | N ORX,ORDA,ORP D:$G(ORSTS) STATUS^ORCSAVE2(+ORIFN,ORSTS) | 
|---|
| 192 | D:ORSTRT!ORSTOP DATES^ORCSAVE2(+ORIFN,ORSTRT,ORSTOP) | 
|---|
| 193 | S ORX=$$CREATE^ORX1(ORNATR) D:ORX | 
|---|
| 194 | . S ORDA=$$ACTION^ORCSAVE(ORACT,+ORIFN,ORNP,OREASON,ORNOW,ORWHO) | 
|---|
| 195 | . I ORDA'>0 S ORERR="Cannot create new order action" Q | 
|---|
| 196 | . D RELEASE^ORCSAVE2(+ORIFN,ORDA,ORNOW,ORWHO,ORNATR) | 
|---|
| 197 | . D SIGSTS^ORCSAVE2(+ORIFN,ORDA) | 
|---|
| 198 | . I $G(ORL) S ORP(1)=+ORIFN_";"_ORDA_"^1" D PRINTS^ORWD1(.ORP,+ORL) | 
|---|
| 199 | . S $P(^OR(100,+ORIFN,3),U,7)=ORDA | 
|---|
| 200 | I 'ORX,ORACT="DC",'$$ACTV^ORX1(ORNATR) S $P(^OR(100,+ORIFN,3),U,7)=0 | 
|---|
| 201 | D:$G(ORACT)="DC" CANCEL^ORCSEND(+ORIFN) | 
|---|
| 202 | Q | 
|---|
| 203 | ; | 
|---|
| 204 | RXO() ; -- RXO segment | 
|---|
| 205 | N I,X S X="",I=$O(@ORMSG@(+ORC)) | 
|---|
| 206 | I I,$E(@ORMSG@(I),1,3)="RXO" S X=I_U_@ORMSG@(I) | 
|---|
| 207 | Q X | 
|---|
| 208 | ; | 
|---|
| 209 | RXE() ; -- RXE segment | 
|---|
| 210 | N X,I,SEG S X="",I=+ORC | 
|---|
| 211 | F  S I=$O(@ORMSG@(I)) Q:I'>0  S SEG=$E(@ORMSG@(I),1,3) Q:SEG="ORC"  I SEG="RXE" S X=I_U_@ORMSG@(I) Q | 
|---|
| 212 | Q X | 
|---|
| 213 | ; | 
|---|
| 214 | RXR() ; -- RXR segment | 
|---|
| 215 | N X,I,SEG S X="",I=+RXE | 
|---|
| 216 | F  S I=$O(@ORMSG@(I)) Q:I'>0  S SEG=$E(@ORMSG@(I),1,3) Q:SEG="ORC"  I SEG="RXR" S X=I_U_@ORMSG@(I) Q | 
|---|
| 217 | Q X | 
|---|
| 218 | ; | 
|---|
| 219 | RXC() ; -- [First] RXC segment | 
|---|
| 220 | N X,I,SEG S X="",I=+RXE | 
|---|
| 221 | F  S I=$O(@ORMSG@(I)) Q:I'>0  S SEG=$E(@ORMSG@(I),1,3) Q:SEG="ORC"  I SEG="RXC" S X=I Q | 
|---|
| 222 | Q X | 
|---|
| 223 | ; | 
|---|
| 224 | ZRX() ; -- ZRX segment | 
|---|
| 225 | N X,I,SEG S X="",I=+ORC | 
|---|
| 226 | F  S I=$O(@ORMSG@(I)) Q:I'>0  S SEG=$E(@ORMSG@(I),1,3) Q:SEG="ORC"  I SEG="ZRX" S X=I_U_@ORMSG@(I) Q | 
|---|
| 227 | Q X | 
|---|