| 1 | ORMRA ; SLC/MKB - Process Radiology ORM msgs ;2/21/02  15:44 [3/4/04 10:43am] | 
|---|
| 2 | ;;3.0;ORDER ENTRY/RESULTS REPORTING;**3,53,92,110,136,153,174,195,228**;Dec 17, 1997 | 
|---|
| 3 | ;DBIA 2968 allows for reading ^DIC(34 | 
|---|
| 4 | EN ; -- entry point for RA messages | 
|---|
| 5 | I '$L($T(@ORDCNTRL)) Q  ;S ORERR="Invalid order control code" Q | 
|---|
| 6 | I ORDCNTRL'="SN",ORDCNTRL'="ZP",'ORIFN!('$D(^OR(100,+ORIFN,0))) S ORERR="Invalid OE/RR order number" Q | 
|---|
| 7 | S OREASON=$S($P(OREASON,U,6)="99RAR":$P(OREASON,U,5),1:$P(OREASON,U,2)) | 
|---|
| 8 | S:'ORDUZ ORDUZ=DUZ S:'ORLOG ORLOG=+$E($$NOW^XLFDT,1,12) | 
|---|
| 9 | D @ORDCNTRL | 
|---|
| 10 | Q | 
|---|
| 11 | ; | 
|---|
| 12 | ZP ; -- Purged | 
|---|
| 13 | Q:'ORIFN  Q:'$D(^OR(100,+ORIFN,0))  K ^OR(100,+ORIFN,4) | 
|---|
| 14 | ; - Set status=lapsed, if still active | 
|---|
| 15 | I "^3^5^6^8^"[(U_$P($G(^OR(100,+ORIFN,3)),U,3)_U) D STATUS^ORCSAVE2(ORIFN,14) | 
|---|
| 16 | Q | 
|---|
| 17 | ; | 
|---|
| 18 | ZR ; -- Purged as requested [ack] | 
|---|
| 19 | D DELETE^ORCSAVE2(+ORIFN) | 
|---|
| 20 | Q | 
|---|
| 21 | ; | 
|---|
| 22 | ZU ; -- Unable to purge [ack] | 
|---|
| 23 | S $P(^OR(100,+ORIFN,3),U)=$$NOW^XLFDT ; update Last Activity | 
|---|
| 24 | Q | 
|---|
| 25 | ; | 
|---|
| 26 | OK ; -- Order accepted, RA order # assigned [ack] | 
|---|
| 27 | N ORSTS,OBR S ^OR(100,+ORIFN,4)=PKGIFN,ORSTS=5 ; 5=pending | 
|---|
| 28 | ; Ck if also scheduled, else quit | 
|---|
| 29 | S OBR=$O(@ORMSG@(+ORC)) G:'OBR OKQ G:$E(@ORMSG@(OBR),1,3)'="OBR" OKQ | 
|---|
| 30 | S ORSTRT=$$FMDATE^ORM($P(@ORMSG@(OBR),"|",37)) | 
|---|
| 31 | D:ORSTRT DATES^ORCSAVE2(+ORIFN,ORSTRT) | 
|---|
| 32 | OKQ D STATUS^ORCSAVE2(ORIFN,ORSTS) | 
|---|
| 33 | ;Save the Radiology pre-certification Account Reference in the PV1 | 
|---|
| 34 | ;segment of the HL7 message from the Radiology package to the Order | 
|---|
| 35 | ;File (#100). Support for Patch OR*3.0*228 | 
|---|
| 36 | D PRECERT^ORWPFSS2 | 
|---|
| 37 | Q | 
|---|
| 38 | ; | 
|---|
| 39 | XX ; -- Change order | 
|---|
| 40 | N ORDIALOG,ORDG,ORDA,ORX,ORP S:'$L(ORNATR) ORNATR="S" | 
|---|
| 41 | D DLG Q:$D(ORERR)  Q:'$D(ORDIALOG)  S ORIFN=+ORIFN | 
|---|
| 42 | S ORDA=$$ACTION^ORCSAVE("XX",ORIFN,ORNP,OREASON,ORLOG,ORDUZ) | 
|---|
| 43 | I ORDA'>0 S ORERR="Cannot create new order action" Q | 
|---|
| 44 | ; -Update sts of order to active, last action to dc/edit: | 
|---|
| 45 | S ORX=+$P($G(^OR(100,ORIFN,3)),U,7) | 
|---|
| 46 | S:$P($G(^OR(100,ORIFN,8,ORX,0)),U,15)="" $P(^(0),U,15)=12 | 
|---|
| 47 | S $P(^OR(100,ORIFN,3),U,7)=ORDA D STATUS^ORCSAVE2(ORIFN,6) | 
|---|
| 48 | D RELEASE^ORCSAVE2(ORIFN,ORDA,ORLOG,ORDUZ,ORNATR) | 
|---|
| 49 | ; -If unsigned edit, leave XX unsigned & mark ORX as Sig Not Req'd | 
|---|
| 50 | S ORSIG=$S($P($G(^OR(100,ORIFN,8,ORX,0)),U,4)'=2:1,1:0) | 
|---|
| 51 | D SIGSTS^ORCSAVE2(ORIFN,ORDA):ORSIG,SIGN^ORCSAVE2(ORIFN,,,5,ORX):'ORSIG | 
|---|
| 52 | ; -Update responses, get/save new order text: | 
|---|
| 53 | K ^OR(100,ORIFN,4.5) D RESPONSE^ORCSAVE,ORDTEXT^ORCSAVE1(ORIFN_";"_ORDA) | 
|---|
| 54 | S $P(^OR(100,ORIFN,8,ORDA,0),U,14)=ORDA | 
|---|
| 55 | I $G(ORL) S ORP(1)=+ORIFN_";"_ORDA_"^1" D PRINTS^ORWD1(.ORP,+ORL) | 
|---|
| 56 | Q | 
|---|
| 57 | ; | 
|---|
| 58 | SN ; -- New backdoor order: return NA msg w/ORIFN, or DE msg | 
|---|
| 59 | N ORDIALOG,ORDG,ORP K ^TMP("ORWORD",$J) S:'$L(ORNATR) ORNATR="W" | 
|---|
| 60 | I ORDUZ,'$D(^VA(200,ORDUZ,0)) S ORERR="Invalid entering person" Q | 
|---|
| 61 | I '$D(^VA(200,ORNP,0)) S ORERR="Missing or invalid ordering provider" Q | 
|---|
| 62 | I '$G(ORL) S ORERR="Missing or invalid patient location" Q | 
|---|
| 63 | D DLG Q:$D(ORERR)  Q:'$D(ORDIALOG) | 
|---|
| 64 | SNQ D EN^ORCSAVE K ^TMP("ORWORD",$J) | 
|---|
| 65 | I '$G(ORIFN) S ORERR="Cannot create new order" Q | 
|---|
| 66 | ;Save DG1 and ZCL segments of HL7 message from backdoor orders | 
|---|
| 67 | D BDOSTR^ORWDBA3 | 
|---|
| 68 | ;Save the Rediology pre-certification Account Reference in the PV1 | 
|---|
| 69 | ;segment of the HL7 message from the Radiology package to the Order | 
|---|
| 70 | ;File (#100). Support for Patch OR*3.0*228 | 
|---|
| 71 | D PRECERT^ORWPFSS2 | 
|---|
| 72 | D RELEASE^ORCSAVE2(ORIFN,1,ORLOG,ORDUZ,ORNATR),SIGSTS^ORCSAVE2(ORIFN,1) | 
|---|
| 73 | D STATUS^ORCSAVE2(ORIFN,5) S ^OR(100,ORIFN,4)=PKGIFN | 
|---|
| 74 | I $G(ORL) S ORP(1)=ORIFN_";1^1" D PRINTS^ORWD1(.ORP,+ORL) ; chart copy | 
|---|
| 75 | Q | 
|---|
| 76 | ; | 
|---|
| 77 | DLG ; -- Build ORDIALOG() from msg | 
|---|
| 78 | N OBR,OI,MODS,J,X,Y,ILOC,MODE,CH,CHI,OBX,NTE | 
|---|
| 79 | S ORDIALOG=$O(^ORD(101.41,"AB","RA OERR EXAM",0)) | 
|---|
| 80 | D GETDLG1^ORCD(ORDIALOG) | 
|---|
| 81 | S ORDIALOG($$PTR("CATEGORY"),1)=$G(ORCAT) | 
|---|
| 82 | S ORDIALOG($$PTR("START DATE/TIME"),1)=ORSTRT | 
|---|
| 83 | S ORDIALOG($$PTR("URGENCY"),1)=ORURG | 
|---|
| 84 | S:$P(ORC,"|",12) ORDIALOG($$PTR("PROVIDER"),1)=+$P(ORC,"|",12) | 
|---|
| 85 | D1 S OBR=$O(@ORMSG@(+ORC)) I 'OBR!($E($G(@ORMSG@(OBR)),1,3)'="OBR") S ORERR="Missing OBR segment" Q | 
|---|
| 86 | S OI=$$ORDITEM^ORM($P(@ORMSG@(OBR),"|",5)) | 
|---|
| 87 | I 'OI S ORERR="Invalid procedure" Q | 
|---|
| 88 | S ORDIALOG($$PTR("ORDERABLE ITEM"),1)=OI | 
|---|
| 89 | S ORDG=$P($G(^ORD(101.43,+OI,"RA")),U,3) S:$L(ORDG) ORDG=+$O(^ORD(100.98,"B",ORDG,0)) I 'ORDG S ORDG=$P(^ORD(101.41,+ORDIALOG,0),U,5) ; Im Type | 
|---|
| 90 | S MODS=$P(@ORMSG@(OBR),"|",19) I $L(MODS) D | 
|---|
| 91 | . F J=1:1:$L(MODS,"~") S X=$P(MODS,"~",J) I $L(X) S Y=$O(^RAMIS(71.2,"B",X,0)) S:Y ORDIALOG($$PTR("MODIFIERS"),J)=Y | 
|---|
| 92 | S ILOC=+$P(@ORMSG@(OBR),"|",20),MODE=$P(@ORMSG@(OBR),"|",31) | 
|---|
| 93 | S:ILOC ORDIALOG($$PTR("IMAGING LOCATION"),1)=ILOC | 
|---|
| 94 | S ORDIALOG($$PTR("MODE OF TRANSPORT"),1)=$S(MODE="WALK":"A",MODE="CART":"S",1:$E(MODE)) | 
|---|
| 95 | I ORDCNTRL="XX" S NTE=+$O(@ORMSG@(OBR)) I NTE,$E($G(@ORMSG@(NTE)),1,3)="NTE" S OREASON=$P(@ORMSG@(NTE),"|",4) ;Tech's Comments | 
|---|
| 96 | D2 ; might the procedure be scheduled at this point ??  Not in spec | 
|---|
| 97 | S CH=$$PTR("WORD PROCESSING 1"),CHI=0 | 
|---|
| 98 | S OBX=OBR F  S OBX=$O(@ORMSG@(OBX)) Q:OBX'>0  S J=$E(@ORMSG@(OBX),1,3) Q:J="ORC"  Q:J="MSH"  I J="OBX" D | 
|---|
| 99 | . N NAME,VALUE,X0 S VALUE=$P(@ORMSG@(OBX),"|",6) | 
|---|
| 100 | . S NAME=$$UP^XLFSTR($P($P(@ORMSG@(OBX),"|",4),U,2)) | 
|---|
| 101 | . I NAME="CONTRACT/SHARING SOURCE" S X0=$G(^DIC(34,+VALUE,0)) S:$L(X0) ORDIALOG($$PTR(NAME),1)=+VALUE,ORDIALOG($$PTR("CATEGORY"),1)=$P(X0,U,2) Q | 
|---|
| 102 | . I NAME="RESEARCH SOURCE" S ORDIALOG($$PTR(NAME),1)=VALUE,ORDIALOG($$PTR("CATEGORY"),1)="R" Q | 
|---|
| 103 | . I NAME="PREGNANT" S ORDIALOG($$PTR(NAME),1)=VALUE Q | 
|---|
| 104 | . I NAME="PRE-OP SCHEDULED DATE/TIME" S ORDIALOG($$PTR(NAME),1)=$$FMDATE^ORM(VALUE) Q | 
|---|
| 105 | . S CHI=CHI+1,^TMP("ORWORD",$J,CH,1,CHI,0)=VALUE | 
|---|
| 106 | S:CHI ^TMP("ORWORD",$J,CH,1,0)="^^"_CHI_U_CHI_U_DT_U,ORDIALOG(CH,1)="^TMP(""ORWORD"",$J,"_CH_",1)" | 
|---|
| 107 | Q | 
|---|
| 108 | ; | 
|---|
| 109 | PTR(X) ; -- Returns ptr to prompt in Order Dialog file #101.41 | 
|---|
| 110 | Q +$O(^ORD(101.41,"AB",$E("OR GTX "_X,1,63),0)) | 
|---|
| 111 | ; | 
|---|
| 112 | SC ; -- Status changed (scheduled, registered, or unverified) | 
|---|
| 113 | N ORSTS,OBR,OR3 ;110 | 
|---|
| 114 | S ORSTS=$S(ORDSTS="ZR":6,ORDSTS="ZU":6,1:8),OR3=$G(^OR(100,+ORIFN,3)) ;110 | 
|---|
| 115 | G:ORSTS=6 SCQ ;136  Done if active, else get scheduled data | 
|---|
| 116 | S OBR=$O(@ORMSG@(+ORC)) I 'OBR!($E($G(@ORMSG@(OBR)),1,3)'="OBR") S ORERR="Missing OBR segment" Q | 
|---|
| 117 | S ORSTRT=$$FMDATE^ORM($P(@ORMSG@(OBR),"|",37)) | 
|---|
| 118 | D:ORSTRT DATES^ORCSAVE2(+ORIFN,ORSTRT) | 
|---|
| 119 | I $P(OR3,U,3)=3,$P($G(^OR(100,+ORIFN,8,+$P(OR3,U,7),0)),U,2)="HD" D RL ;If status is hold and current action is hold then release.  Added with 110 | 
|---|
| 120 | SCQ D STATUS^ORCSAVE2(ORIFN,ORSTS) | 
|---|
| 121 | Q | 
|---|
| 122 | ; | 
|---|
| 123 | RE ; -- Completed, w/results | 
|---|
| 124 | N I,SEG,OBX | 
|---|
| 125 | D STATUS^ORCSAVE2(ORIFN,2) | 
|---|
| 126 | S OBX="" D  ;get Results D/T [from OBR] | 
|---|
| 127 | . N DA,DR,DIE,X,Y,OBR | 
|---|
| 128 | . S DA=+ORIFN,DIE="^OR(100,",OBR=+$O(@ORMSG@(+ORC)),X="" | 
|---|
| 129 | . I OBR,$E($G(@ORMSG@(OBR)),1,3)="OBR" S X=$P(@ORMSG@(OBR),"|",23) | 
|---|
| 130 | . S DR="71////"_$S(X:$$FMDATE^ORM(X),1:+$E($$NOW^XLFDT,1,12)) D ^DIE | 
|---|
| 131 | S I=+ORC F  S I=$O(@ORMSG@(I)) Q:I<1  S SEG=$G(@ORMSG@(I)) Q:$E(SEG,1,3)="ORC"  I $E(SEG,1,3)="OBX" S OBX=I_U_SEG Q  ;first one | 
|---|
| 132 | S $P(^OR(100,+ORIFN,7),U,2)=$S($P(OBX,"|",9)="A":1,1:"") | 
|---|
| 133 | S:'$G(ORNP) ORNP=+$P($G(^OR(100,+ORIFN,0)),U,4) | 
|---|
| 134 | I $L($T(ADD^ORRCACK)) D ADD^ORRCACK(+ORIFN,ORNP) ;Ack stub for prov | 
|---|
| 135 | Q | 
|---|
| 136 | ; | 
|---|
| 137 | OH ; -- Held | 
|---|
| 138 | D UPDATE(3,"HD") | 
|---|
| 139 | Q | 
|---|
| 140 | ; | 
|---|
| 141 | OC ; -- Cancelled/Unable to accept [ack] | 
|---|
| 142 | UA ; -- Unable to accept [ack] | 
|---|
| 143 | S:'$L(ORNATR) ORNATR="X" ;Rejected | 
|---|
| 144 | S ^OR(100,+ORIFN,6)=$O(^ORD(100.02,"C",ORNATR,0))_U_U_ORLOG_U_U_OREASON | 
|---|
| 145 | D STATUS^ORCSAVE2(ORIFN,13) | 
|---|
| 146 | UD ; -- Unable to discontinue [ack] | 
|---|
| 147 | N DA S DA=+$P(ORIFN,";",2) I DA D | 
|---|
| 148 | . S $P(^OR(100,+ORIFN,8,DA,0),U,15)=13 ;Request rejected | 
|---|
| 149 | . S:$L(OREASON) ^OR(100,+ORIFN,8,DA,1)=OREASON | 
|---|
| 150 | Q | 
|---|
| 151 | ; | 
|---|
| 152 | OD ; -- Discontinued | 
|---|
| 153 | S:$G(DGPMT) ORDUZ="" ;auto-dc on movement | 
|---|
| 154 | S ^OR(100,+ORIFN,6)=$S($L(ORNATR):$O(^ORD(100.02,"C",ORNATR,0)),1:"")_U_ORDUZ_U_ORLOG_U_U_OREASON | 
|---|
| 155 | D UPDATE(1,"DC") | 
|---|
| 156 | Q | 
|---|
| 157 | ; | 
|---|
| 158 | DR ; -- Discontinued [ack] | 
|---|
| 159 | D STATUS^ORCSAVE2(ORIFN,1) | 
|---|
| 160 | Q | 
|---|
| 161 | ; | 
|---|
| 162 | UPDATE(ORSTS,ORACT) ; -- continue processing | 
|---|
| 163 | N ORX,ORDA,ORP D:$G(ORSTS) STATUS^ORCSAVE2(ORIFN,ORSTS) | 
|---|
| 164 | S ORX=$$CREATE^ORX1(ORNATR) D:ORX | 
|---|
| 165 | . S ORDA=$$ACTION^ORCSAVE(ORACT,+ORIFN,ORNP,OREASON,ORLOG,ORDUZ) | 
|---|
| 166 | . I ORDA'>0 S ORERR="Cannot create new order action" Q | 
|---|
| 167 | . D RELEASE^ORCSAVE2(+ORIFN,ORDA,ORLOG,ORDUZ,ORNATR) | 
|---|
| 168 | . D SIGSTS^ORCSAVE2(+ORIFN,ORDA) | 
|---|
| 169 | . I $G(ORL) S ORP(1)=+ORIFN_";"_ORDA_"^1" D PRINTS^ORWD1(.ORP,+ORL) | 
|---|
| 170 | . S $P(^OR(100,+ORIFN,3),U,7)=ORDA | 
|---|
| 171 | I 'ORX D  ;no new action created | 
|---|
| 172 | . I ORACT="DC" S:'$$ACTV^ORX1(ORNATR) $P(^OR(100,+ORIFN,3),U,7)=0 Q | 
|---|
| 173 | . S:ORACT="HD"&$L(OREASON) ^OR(100,+ORIFN,8,1,1)=OREASON ;pend/sch only | 
|---|
| 174 | D:ORACT="DC" CANCEL^ORCSEND(+ORIFN) | 
|---|
| 175 | Q | 
|---|
| 176 | ; | 
|---|
| 177 | RL ;Release hold --entire section added with patch 110 | 
|---|
| 178 | S ^OR(100,+ORIFN,8,$P(OR3,U,7),2)=ORLOG_"^"_ORDUZ  ;Set release hold date/time and release hold user | 
|---|
| 179 | S ORNATR=$S($L(ORNATR):ORNATR,1:$P(^OR(100,+ORIFN,8,$P(OR3,U,7),0),U,12)) ;set nature of order for release equal to nature of order for hold if it doesn't exist | 
|---|
| 180 | I $G(ORSTS)="" S ORSTS=6 | 
|---|
| 181 | D UPDATE(ORSTS,"RL") | 
|---|
| 182 | Q | 
|---|