| 1 | ORMFH ;SLC/MKB - Process Dietetics ORM msgs ;5/5/05  13:18 | 
|---|
| 2 | ;;3.0;ORDER ENTRY/RESULTS REPORTING;**3,73,92,215**;Dec 17, 1997 | 
|---|
| 3 | ; | 
|---|
| 4 | EN ; -- entry point for FH 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 ORLOG=+$E($$NOW^XLFDT,1,12) S:'$G(ORDUZ) ORDUZ=DUZ S:'$G(ORNP) ORNP=ORDUZ | 
|---|
| 8 | S:$G(DGPMT) ORNATR="A",OREASON=$S(DGPMT=1:"Admission",DGPMT=3:"Discharge",1:"Transfer"),ORDUZ="" | 
|---|
| 9 | D @ORDCNTRL | 
|---|
| 10 | Q | 
|---|
| 11 | ; | 
|---|
| 12 | ZP ; -- Purged | 
|---|
| 13 | Q:'ORIFN  Q:'$D(^OR(100,+ORIFN,0)) | 
|---|
| 14 | K ^OR(100,+ORIFN,4) I "^6^8^"[(U_$P($G(^(3)),U,3)_U) D STATUS^ORCSAVE2(+ORIFN,14) ; Remove pkg reference, sts=lapsed if still active | 
|---|
| 15 | Q | 
|---|
| 16 | ; | 
|---|
| 17 | ZR ; -- Purged as requested [ack] | 
|---|
| 18 | D DELETE^ORCSAVE2(+ORIFN) | 
|---|
| 19 | Q | 
|---|
| 20 | ; | 
|---|
| 21 | ZU ; -- Unable to purge [ack] | 
|---|
| 22 | S $P(^OR(100,+ORIFN,3),U)=$$NOW^XLFDT ; update Last Activity | 
|---|
| 23 | Q | 
|---|
| 24 | ; | 
|---|
| 25 | OK ; -- Order accepted, FH order # assigned [ack] | 
|---|
| 26 | N ORSTS S ^OR(100,+ORIFN,4)=PKGIFN ; FH identifier | 
|---|
| 27 | I "DN"'[$E(PKGIFN) S ORSTS=6 ;not Diet or NPO | 
|---|
| 28 | E  S ORSTS=$S($P($G(^OR(100,+ORIFN,0)),U,8)>ORLOG:8,1:6) | 
|---|
| 29 | D STATUS^ORCSAVE2(+ORIFN,ORSTS) | 
|---|
| 30 | Q | 
|---|
| 31 | ; | 
|---|
| 32 | XX ; -- Edited backdoor order (OP recurring meals only) | 
|---|
| 33 | D XX^ORMFH1 Q | 
|---|
| 34 | ; | 
|---|
| 35 | SN ; -- New backdoor order: return NA msg w/ORIFN | 
|---|
| 36 | N ODS,ODT,OBR,ORDIALOG,X,I,OI,SEG,ORNEW,ORPARAM,ORTIME,ORSTS,ORDG,ORP,ORTRAIL | 
|---|
| 37 | ;I '$D(^VA(200,+ORNP,0)) S ORERR="Missing or invalid ordering provider"Q | 
|---|
| 38 | ; Don't require provider until Nature of Order is added | 
|---|
| 39 | I '$G(DGPMT),'$D(^VA(200,+ORDUZ,0)) S ORERR="Missing or invalid entering person" Q | 
|---|
| 40 | I 'ORSTRT S ORERR="Missing effective date/time" Q | 
|---|
| 41 | ;I '$G(ORL) S ORERR="Missing or invalid patient location" Q | 
|---|
| 42 | D EN1^FHWOR8(ORL,.ORPARAM) | 
|---|
| 43 | S ODS=$O(@ORMSG@(+ORC)) I 'ODS S ORERR="Incomplete message" Q | 
|---|
| 44 | S ODS=ODS_U_@ORMSG@(ODS),ORSTS=6 I '$L(ORNATR),ORCAT="I" S ORNATR="S" | 
|---|
| 45 | I $E($P(ODS,U,2),1,3)="OBR" S OBR=ODS D IP G SN1 | 
|---|
| 46 | I $E($P(ODS,U,2),1,3)="ODT" S ODT=ODS D TRAY G SN1 | 
|---|
| 47 | I $E($P(ODS,U,2),1,3)'="ODS" S ORERR="Missing or invalid ODS segment" Q | 
|---|
| 48 | I $P(ODS,"|",2)="ZE" D TF G SN1 | 
|---|
| 49 | I $P(ODS,"|",4)?1"^^^FH-6".E D ADDL G SN1 | 
|---|
| 50 | I ORCAT'="I" D OPM^ORMFH1 G SN1 | 
|---|
| 51 | I $P(ODS,"|",4)?1"^^^FH-5".E D NPO G SN1 | 
|---|
| 52 | DIET ; Diet order | 
|---|
| 53 | S ORDIALOG=$O(^ORD(101.41,"AB","FHW1",0)),ORTRAIL="Diet" | 
|---|
| 54 | D GETDLG1^ORCD(ORDIALOG) S:ORSTRT>ORLOG ORSTS=8 | 
|---|
| 55 | S ORDIALOG($$PTR("START DATE/TIME"),1)=ORSTRT | 
|---|
| 56 | S:ORSTOP ORDIALOG($$PTR("STOP DATE/TIME"),1)=ORSTOP | 
|---|
| 57 | S X=$P(ODS,"|",2),ORDIALOG($$PTR("DELIVERY"),1)=$S($L(X)=1:X,1:$E(X,2)) | 
|---|
| 58 | ; Comments ?? | 
|---|
| 59 | S X=$$ORDITEM^ORM($P(ODS,"|",4)) | 
|---|
| 60 | I 'X S ORERR="Missing or invalid diet modification" Q | 
|---|
| 61 | S I=1,OI=$$PTR("ORDERABLE ITEM"),ORDIALOG(OI,I)=X | 
|---|
| 62 | I $O(@ORMSG@(+ODS)) F  S ODS=$O(@ORMSG@(+ODS)) Q:ODS'>0  S SEG=$E(@ORMSG@(+ODS),1,3) Q:SEG="ORC"  Q:SEG="MSH"  I SEG="ODS" D  Q:$D(ORERR) | 
|---|
| 63 | . S X=$$ORDITEM^ORM($P(@ORMSG@(+ODS),"|",4)) | 
|---|
| 64 | . I 'X S ORERR="Missing or invalid diet modification" Q | 
|---|
| 65 | . S I=I+1,ORDIALOG(OI,I)=X | 
|---|
| 66 | SN1 ; continue ... save order, post message | 
|---|
| 67 | Q:$D(ORERR) | 
|---|
| 68 | D EN^ORCSAVE I '$G(ORIFN) S ORERR="Cannot create new order" Q | 
|---|
| 69 | D RELEASE^ORCSAVE2(ORIFN,1,ORLOG,ORDUZ,ORNATR),SIGSTS^ORCSAVE2(ORIFN,1) | 
|---|
| 70 | D:'$P($G(^OR(100,ORIFN,0)),U,8) DATES^ORCSAVE2(ORIFN,ORSTRT,ORSTOP) | 
|---|
| 71 | D STATUS^ORCSAVE2(ORIFN,ORSTS) | 
|---|
| 72 | I $G(ORL) S ORP(1)=ORIFN_";1^1" D PRINTS^ORWD1(.ORP,+ORL) ; chart copy | 
|---|
| 73 | S ^OR(100,ORIFN,4)=PKGIFN | 
|---|
| 74 | Q | 
|---|
| 75 | ; | 
|---|
| 76 | TRAY ; Early/Late tray | 
|---|
| 77 | I 'ORSTOP S ORERR="Missing stop date" Q | 
|---|
| 78 | S ORDIALOG=$O(^ORD(101.41,"AB","FHW2",0)) D GETDLG1^ORCD(ORDIALOG),EN2^ORCDFH | 
|---|
| 79 | S ORDIALOG($$PTR("START DATE"),1)=ORSTRT | 
|---|
| 80 | S ORDIALOG($$PTR("STOP DATE"),1)=ORSTOP | 
|---|
| 81 | N DAYS,SCH S DAYS="",SCH=$P(ORQT,U,2) | 
|---|
| 82 | I $L(SCH),SCH'="ONCE" F I=1:1:$L(SCH,"~") S X=+$P($P(SCH,"~",I),"J",2),DAYS=DAYS_$E("MTWRFSX",X) | 
|---|
| 83 | S:$L(DAYS) ORDIALOG($$PTR("SCHEDULE"),1)=DAYS | 
|---|
| 84 | S OI=+$O(^ORD(101.43,"S.E/L T",$P(ODT,"|",2)_" TRAY",0)),ORDIALOG($$PTR("ORDERABLE ITEM"),1)=OI | 
|---|
| 85 | S X=$P($P(ODT,"|",3),U,4),ORDIALOG($$PTR("MEAL"),1)=$E(X) | 
|---|
| 86 | S ORDIALOG($$PTR("MEAL TIME"),1)=$P($G(ORTIME(OI,$E(X),+$E(X,3))),U,2) | 
|---|
| 87 | S:$L($P(ODT,"|",4)) ORDIALOG($$PTR("YES/NO"),1)=1 | 
|---|
| 88 | Q | 
|---|
| 89 | ; | 
|---|
| 90 | IP ; Isolation/Precautions | 
|---|
| 91 | N IP S IP=+$P($P(OBR,"|",13),U,4) | 
|---|
| 92 | I IP'>0 S ORERR="Missing or invalid isolation type" Q | 
|---|
| 93 | S ORDIALOG=$O(^ORD(101.41,"AB","FHW3",0)) D GETDLG1^ORCD(ORDIALOG) | 
|---|
| 94 | S ORDIALOG($$PTR("ISOLATION TYPE"),1)=IP | 
|---|
| 95 | S ORDIALOG($$PTR("ORDERABLE ITEM"),1)=$O(^ORD(101.43,"S.PREC","ISOLATION PROCEDURES",0)) | 
|---|
| 96 | Q | 
|---|
| 97 | ; | 
|---|
| 98 | TF ; Tubefeeding | 
|---|
| 99 | N OI,STR,INSTR,CMMT,I,X,X4,XI,ZQT,QT,QTY,DUR | 
|---|
| 100 | S ORDIALOG=$O(^ORD(101.41,"AB","FHW8",0)) D GETDLG1^ORCD(ORDIALOG) | 
|---|
| 101 | S OI=$$PTR("ORDERABLE ITEM"),STR=$$PTR("STRENGTH FH") | 
|---|
| 102 | S INSTR=$$PTR("INSTRUCTIONS"),CMMT=$$PTR("FREE TEXT 1") | 
|---|
| 103 | ; Comments ?? | 
|---|
| 104 | S I=0 F  D  S ODS=$O(@ORMSG@(+ODS)) Q:ODS'>0  Q:$E(@ORMSG@(ODS),1,3)="ORC"  S ODS=ODS_U_@ORMSG@(ODS) | 
|---|
| 105 | . Q:$E($P(ODS,U,2),1,3)'="ODS"  ; not ODS segment | 
|---|
| 106 | . S X=$P(ODS,"|",4),X4=$P(X,U,4) ; OI | 
|---|
| 107 | . S:X4["-" $P(X,U,4)=+X4,X4=+$P(X4,"-",2) ; strength | 
|---|
| 108 | . S XI=$$ORDITEM^ORM(X) I 'XI S ORERR="Missing or invalid tubefeeding product" Q | 
|---|
| 109 | . S ZQT=$O(@ORMSG@(+ODS)) I 'ZQT S ORERR="Missing QT information" Q | 
|---|
| 110 | . S QT=$P(@ORMSG@(ZQT),"|",3),DUR=$P(QT,U,3) | 
|---|
| 111 | . S QTY=+QT_" "_$$UNITS($P($P(QT,U),"&",2))_"/"_$P(QT,U,2) | 
|---|
| 112 | . S:$L(DUR) QTY=QTY_" X "_+$E(DUR,2,99)_$S($E(DUR)="H":"HR",1:"") | 
|---|
| 113 | . S I=I+1,ORDIALOG(OI,I)=XI,ORDIALOG(STR,I)=X4,ORDIALOG(INSTR,I)=QTY | 
|---|
| 114 | . S:$L($P(ODS,"|",5)) ORDIALOG(CMMT,I)=$P(ODS,"|",5) | 
|---|
| 115 | I ORCAT="O",ORQT["~" D DATES | 
|---|
| 116 | Q | 
|---|
| 117 | ; | 
|---|
| 118 | UNITS(X) ; -- Returns name of unit X | 
|---|
| 119 | N Y S X=$E(X) | 
|---|
| 120 | S Y=$S(X="K":"KCAL",X="C":"CC",X="M":"ML",X="O":"OZ",X="U":"UNITS",X="T":"TBSP",X="G":"GM",1:"") | 
|---|
| 121 | Q Y | 
|---|
| 122 | ; | 
|---|
| 123 | NPO ; NPO <uses FHW1 dialog - FHW4 now a quick order> | 
|---|
| 124 | S ORDIALOG=$O(^ORD(101.41,"AB","FHW1",0)) D GETDLG1^ORCD(ORDIALOG) | 
|---|
| 125 | S ORDIALOG($$PTR("ORDERABLE ITEM"),1)=$O(^ORD(101.43,"S.DIET","NPO",0)) | 
|---|
| 126 | S ORDIALOG($$PTR("START DATE/TIME"),1)=ORSTRT S:ORSTRT>ORLOG ORSTS=8 | 
|---|
| 127 | S:ORSTOP ORDIALOG($$PTR("STOP DATE/TIME"),1)=ORSTOP | 
|---|
| 128 | S:$L($P(ODS,"|",5)) ORDIALOG($$PTR("FREE TEXT 1"),1)=$P(ODS,"|",5) | 
|---|
| 129 | Q | 
|---|
| 130 | ; | 
|---|
| 131 | ADDL ; Additional order | 
|---|
| 132 | S ORDIALOG=$O(^ORD(101.41,"AB","FHW7",0)) D GETDLG1^ORCD(ORDIALOG) | 
|---|
| 133 | S ORDIALOG($$PTR("FREE TEXT 1"),1)=$P(ODS,"|",5) | 
|---|
| 134 | I ORCAT="O",ORQT["~" D DATES | 
|---|
| 135 | Q | 
|---|
| 136 | ; | 
|---|
| 137 | DATES ; -- pull dates out of ORQT | 
|---|
| 138 | N P,I,X S P=$$PTR("DATE/TIME") | 
|---|
| 139 | F I=1:1:$L(ORQT,"~") S X=$P(ORQT,"~",I),ORDIALOG(P,I)=$$HL7TFM^XLFDT($P(X,U,4)) | 
|---|
| 140 | S ORSTRT=$G(ORDIALOG(P,1)),ORSTOP=$G(ORDIALOG(P,I)) | 
|---|
| 141 | Q | 
|---|
| 142 | ; | 
|---|
| 143 | SC ; -- Status Change | 
|---|
| 144 | SR ; -- Status Update [ack] | 
|---|
| 145 | N ORSTS,OROLD S OROLD=$P($G(^OR(100,+ORIFN,3)),U,3) | 
|---|
| 146 | D DATES^ORCSAVE2(+ORIFN,ORSTRT,ORSTOP) | 
|---|
| 147 | S ORSTS=$S(ORDSTS="DC":1,ORDSTS="IP":6,ORDSTS="ZE":7,ORDSTS="SC":8,1:"") | 
|---|
| 148 | D:ORSTS STATUS^ORCSAVE2(+ORIFN,ORSTS) | 
|---|
| 149 | I ORDSTS="DC",'$D(^OR(100,+ORIFN,6)) D  ;set 6-node | 
|---|
| 150 | . I ORNATR'="A","DN"[$E(PKGIFN) S ORNATR="C" S:'$L(OREASON) OREASON="Replaced with new diet order" S:ORDUZ<1 ORDUZ="" | 
|---|
| 151 | . S ^OR(100,+ORIFN,6)=$S($L(ORNATR):+$O(^ORD(100.02,"C",ORNATR,0)),1:"")_U_ORDUZ_U_ORLOG_U_U_OREASON | 
|---|
| 152 | I OROLD=1,ORSTS=6 D  ; reactivate | 
|---|
| 153 | . N X S $P(^OR(100,+ORIFN,3),U,7)=1,X=$P(^(0),U,9) K ^(6) | 
|---|
| 154 | . I 'ORSTOP,X S $P(^OR(100,+ORIFN,0),U,9)="" K ^OR(100,"AE",X,+ORIFN) | 
|---|
| 155 | . D SETALL^ORDD100(+ORIFN) | 
|---|
| 156 | Q | 
|---|
| 157 | ; | 
|---|
| 158 | OC ; -- Cancelled <E/L Trays only> / [ack] | 
|---|
| 159 | G:ORTYPE="ORR" UA ;rejected new order | 
|---|
| 160 | I $P($G(^OR(100,+ORIFN,3)),U,3)=6,$P(^(0),U,8)<ORLOG G OD | 
|---|
| 161 | S ^OR(100,+ORIFN,6)=$S($L(ORNATR):+$O(^ORD(100.02,"C",ORNATR,0)),1:"")_U_ORDUZ_U_ORLOG_U_U_OREASON | 
|---|
| 162 | D UPDATE(13,"DC") | 
|---|
| 163 | Q | 
|---|
| 164 | ; | 
|---|
| 165 | CR ; -- Cancelled as requested [ack] | 
|---|
| 166 | D STATUS^ORCSAVE2(+ORIFN,13) | 
|---|
| 167 | Q | 
|---|
| 168 | ; | 
|---|
| 169 | OD ; -- Discontinued <Tubefeedings only> | 
|---|
| 170 | S ^OR(100,+ORIFN,6)=$S($L(ORNATR):+$O(^ORD(100.02,"C",ORNATR,0)),1:"")_U_ORDUZ_U_ORLOG_U_U_OREASON | 
|---|
| 171 | D UPDATE(1,"DC") | 
|---|
| 172 | Q | 
|---|
| 173 | ; | 
|---|
| 174 | DR ; -- Discontinued as requested [ack] | 
|---|
| 175 | D STATUS^ORCSAVE2(+ORIFN,1) | 
|---|
| 176 | Q | 
|---|
| 177 | ; | 
|---|
| 178 | UA ; -- Unable to Accept [ack] | 
|---|
| 179 | S:'$L(ORNATR) ORNATR="X" ;Rejected | 
|---|
| 180 | S ^OR(100,+ORIFN,6)=+$O(^ORD(100.02,"C",ORNATR,0))_U_U_ORLOG_U_U_OREASON | 
|---|
| 181 | D STATUS^ORCSAVE2(+ORIFN,13) | 
|---|
| 182 | UC ; -- Unable to Cancel [ack] | 
|---|
| 183 | UD ; -- Unable to Discontinue [ack] | 
|---|
| 184 | N DA S DA=$P(ORIFN,";",2) I DA D | 
|---|
| 185 | . S:$G(OREJECT) $P(^OR(100,+ORIFN,8,DA,0),U,15)=13 ; request rejected | 
|---|
| 186 | . S:$L(OREASON) ^OR(100,+ORIFN,8,DA,1)=OREASON | 
|---|
| 187 | Q | 
|---|
| 188 | ; | 
|---|
| 189 | UPDATE(ORSTS,ORACT) ; -- continue processing | 
|---|
| 190 | N ORX,DA,ORP D DATES^ORCSAVE2(+ORIFN,ORSTRT,ORSTOP) | 
|---|
| 191 | D:$G(ORSTS) STATUS^ORCSAVE2(+ORIFN,ORSTS) | 
|---|
| 192 | S ORX=$$CREATE^ORX1(ORNATR) D:ORX | 
|---|
| 193 | . S DA=$$ACTION^ORCSAVE(ORACT,+ORIFN,ORNP,OREASON,ORLOG,ORDUZ) | 
|---|
| 194 | . I DA'>0 S ORERR="Cannot create new order action" Q | 
|---|
| 195 | . D RELEASE^ORCSAVE2(+ORIFN,DA,ORLOG,ORDUZ,ORNATR) | 
|---|
| 196 | . D SIGSTS^ORCSAVE2(+ORIFN,DA) | 
|---|
| 197 | . I $G(ORL) S ORP(1)=+ORIFN_";"_DA_"^1" D PRINTS^ORWD1(.ORP,+ORL) | 
|---|
| 198 | . S $P(^OR(100,+ORIFN,3),U,7)=DA | 
|---|
| 199 | I 'ORX,ORACT="DC",'$$ACTV^ORX1(ORNATR) S $P(^OR(100,+ORIFN,3),U,7)=0 | 
|---|
| 200 | D:ORACT="DC" CANCEL^ORCSEND(+ORIFN) | 
|---|
| 201 | Q | 
|---|
| 202 | ; | 
|---|
| 203 | PTR(NAME) ; -- Returns ien of prompt NAME in Order Dialog file #101.41 | 
|---|
| 204 | Q $O(^ORD(101.41,"AB",$E("OR GTX "_NAME,1,63),0)) | 
|---|