[623] | 1 | ORMBLDPS ;SLC/MKB-Build outgoing Pharmacy ORM msgs ;11:26 AM 2 Apr 2001
|
---|
| 2 | ;;3.0;ORDER ENTRY/RESULTS REPORTING;**7,38,54,86,97,94,116,129,141,190,195,237,254**;Dec 17, 1997
|
---|
| 3 | PTR(NAME) ; -- Returns ptr value of prompt in Dialog file
|
---|
| 4 | Q +$O(^ORD(101.41,"AB",$E("OR GTX "_NAME,1,63),0))
|
---|
| 5 | ;
|
---|
| 6 | NVA ; -- new Non-VA Meds order
|
---|
| 7 | N NVA S NVA=1
|
---|
| 8 | OUT ; -- new Outpt Meds order
|
---|
| 9 | ; fall through to UD: same msg, +3 fields
|
---|
| 10 | UD ; -- new Inpt (Unit Dose) Meds order
|
---|
| 11 | N OI,DRUG,INSTR,DOSE,ROUTE,SCHED,DUR,URG,PROVCOMM,PI,DISPENSE,X,Y,I,J,K,L,QT1,QT2,QT3,QT4,QT6,QT9,CONJ,ORC,SC,OUTPT
|
---|
| 12 | S OUTPT=$S($P(OR0,U,12)="O":1,1:0) ;outpt flag
|
---|
| 13 | S X=$G(^OR(100,IFN,8,1,0)) I $P(X,U,5),$P(X,U,5)'=$P(X,U,3) S $P(ORMSG(4),"|",13)=$P(X,U,5) ; Send signer instead of orderer if different
|
---|
| 14 | S OI=$$PTR("ORDERABLE ITEM"),DRUG=$$PTR("DISPENSE DRUG")
|
---|
| 15 | S INSTR=$$PTR("INSTRUCTIONS"),SCHED=$$PTR("SCHEDULE")
|
---|
| 16 | S DUR=$$PTR("DURATION"),URG=$$PTR("URGENCY"),DOSE=$$PTR("DOSE")
|
---|
| 17 | S ROUTE=$$PTR("ROUTE"),PROVCOMM=$$PTR("WORD PROCESSING 1")
|
---|
| 18 | S PI=$$PTR("PATIENT INSTRUCTIONS"),CONJ=$$PTR("AND/THEN")
|
---|
| 19 | S J=1,ORC(J)=$P(ORMSG(4),"|",1,7)_"|"
|
---|
| 20 | I +$G(NVA)=1 G NVA1
|
---|
| 21 | UD1 S I=0 F S I=$O(ORDIALOG(INSTR,I)) Q:I'>0 D
|
---|
| 22 | . S QT2=$G(ORDIALOG(SCHED,I)),QT3=$$HL7DUR,X=$G(ORDIALOG(DOSE,I))
|
---|
| 23 | . ;S QT1=$S($L(X):$P(X,"&",1,4)_"&"_$P(X,"&",6),1:"")
|
---|
| 24 | . S QT1=$S($L(X):$P(X,"&",1,6),1:"")
|
---|
| 25 | . S QT6=$P($G(^ORD(101.42,+$G(ORDIALOG(URG,I)),0)),U,2)
|
---|
| 26 | . S QT9=$G(ORDIALOG(CONJ,I))_"~" S:$E(QT9)="T" QT9="S~"
|
---|
| 27 | . S J=J+1,ORC(J)=QT1_U_QT2_U_QT3_"^^^"_QT6_"^^"_$$INSTR_U_QT9
|
---|
| 28 | ;
|
---|
| 29 | NVA1 I +$G(NVA)=1 D
|
---|
| 30 | . S I=1 ;only one dosage possible for non-va meds
|
---|
| 31 | . S QT2=$G(ORDIALOG(SCHED,I)),QT3=$$HL7DUR,X=$G(ORDIALOG(DOSE,I))
|
---|
| 32 | . S QT1=$S($L(X):$P(X,"&",1,6),1:"")
|
---|
| 33 | . S QT6=$P($G(^ORD(101.42,+$G(ORDIALOG(URG,I)),0)),U,2)
|
---|
| 34 | . S QT9=$G(ORDIALOG(CONJ,I))_"~" S:$E(QT9)="T" QT9="S~"
|
---|
| 35 | . S J=J+1,ORC(J)=QT1_U_QT2_U_QT3_"^^^"_QT6_"^^"_$$INSTR_U_QT9
|
---|
| 36 | ;
|
---|
| 37 | I $L($P(OR0,U,8)) S $P(ORC(2),U,4)=$$FMTHL7^XLFDT($P(OR0,U,8)) S:J<2 J=2
|
---|
| 38 | S J=J+1,ORC(J)="|"_$P(ORMSG(4),"|",9,999),ORC=J,X="ORMSG(4)",ORMSG(4)="",I=0
|
---|
| 39 | F J=1:1:ORC S Y=ORC(J) D ;add to ORMSG(4)
|
---|
| 40 | . I $L(@X)+$L(Y)'>245 S @X=@X_Y
|
---|
| 41 | . E S L=245-$L(@X),@X=@X_$E(Y,1,L),I=I+1,X="ORMSG(4,"_I_")",@X=$E(Y,L+1,$L(Y))
|
---|
| 42 | I $G(ORDIALOG(DRUG,1)) S X=$$ENDCM^PSJORUTL(ORDIALOG(DRUG,1)),DISPENSE=$P(X,U,3)_"^^99NDF^"_ORDIALOG(DRUG,1)_"^^99PSD"
|
---|
| 43 | S ORMSG(5)="RXO|"_$$USID^ORMBLD($G(ORDIALOG(OI,1)))_"|||||||||"_$G(DISPENSE)
|
---|
| 44 | UD2 I $G(OUTPT) D
|
---|
| 45 | . N QTY,REFS,DSPY
|
---|
| 46 | . S QTY=$$PTR("QUANTITY"),REFS=$$PTR("REFILLS"),DSPY=$$PTR("DAYS SUPPLY")
|
---|
| 47 | . S ORMSG(5)=ORMSG(5)_"|"_$G(ORDIALOG(QTY,1))_"||"_$G(ORDIALOG(REFS,1))_"||||D"_$G(ORDIALOG(DSPY,1))
|
---|
| 48 | S I=5 I $L($G(ORDIALOG(PROVCOMM,1))) D
|
---|
| 49 | . S J=$O(^TMP("ORWORD",$J,PROVCOMM,1,0)) Q:'J
|
---|
| 50 | . S I=6,ORMSG(6)="NTE|6|P|"_$G(^TMP("ORWORD",$J,PROVCOMM,1,J,0))
|
---|
| 51 | . S K=0 F S J=$O(^TMP("ORWORD",$J,PROVCOMM,1,J)) Q:J'>0 S K=K+1,ORMSG(6,K)=$G(^(J,0))
|
---|
| 52 | I $G(OUTPT),$L($G(ORDIALOG(PI,1))) D
|
---|
| 53 | . S J=$O(^TMP("ORWORD",$J,PI,1,0)) Q:'J
|
---|
| 54 | . S I=I+1,ORMSG(I)="NTE|7|P|"_$G(^TMP("ORWORD",$J,PI,1,J,0))
|
---|
| 55 | . S K=0 F S J=$O(^TMP("ORWORD",$J,PI,1,J)) Q:J'>0 S K=K+1,ORMSG(I,K)=$G(^(J,0))
|
---|
| 56 | UD3 S J=0 F S J=$O(ORDIALOG(ROUTE,J)) Q:J'>0 S I=I+1,ORMSG(I)=$$RXR($G(ORDIALOG(ROUTE,J)))
|
---|
| 57 | I $D(^OR(100,IFN,9)) D ORDCHKS
|
---|
| 58 | S I=I+1,ORMSG(I)=$$ZRX(IFN)
|
---|
| 59 | I $G(OUTPT) D ;add SC data
|
---|
| 60 | . N OR5 S OR5=$G(^OR(100,IFN,5))
|
---|
| 61 | . I $L(OR5),OR5'?5"^" S I=I+1,ORMSG(I)="ZSC|"_$TR(OR5,"^","|") Q
|
---|
| 62 | . S SC=$$PTR("SERVICE CONNECTED") S:$D(ORDIALOG(SC,1)) I=I+1,ORMSG(I)="ZSC|"_$S(ORDIALOG(SC,1):"SC",1:"NSC")
|
---|
| 63 | ; Create DG1 & ZCL segment(s) for Billing Awareness (BA) Project
|
---|
| 64 | D DG1^ORWDBA3($G(IFN),"I",I)
|
---|
| 65 | I $P(^ORD(100.98,$P(OR0,U,11),0),U)="NON-VA MEDICATIONS" D
|
---|
| 66 | . S I=I+1 D ZRN(IFN,.ORMSG,I)
|
---|
| 67 | Q
|
---|
| 68 | ;
|
---|
| 69 | INSTR() ; -- Return text instructions for QT-8, instance I
|
---|
| 70 | N Y S Y=$P($G(ORDIALOG(DOSE,I)),"&",5)
|
---|
| 71 | I $G(ORDIALOG(DRUG,1)),$L(Y) Q Y
|
---|
| 72 | S Y=$G(ORDIALOG(INSTR,I)) I $G(OUTPT) D
|
---|
| 73 | . N UNITS,UNT S UNITS=$$PTR("FREE TEXT"),UNT=$G(ORDIALOG(UNITS,I))
|
---|
| 74 | . S:$L(UNT) Y=Y_" "_UNT ;old format
|
---|
| 75 | Q Y
|
---|
| 76 | ;
|
---|
| 77 | HL7DUR() ; -- Returns HL7 form of duration X
|
---|
| 78 | N X,X1,X2,Y S X=$G(ORDIALOG(DUR,I))
|
---|
| 79 | S X1=+$G(X),Y="" G:X1'>0 HDQ
|
---|
| 80 | S X2=$$UP^XLFSTR($P(X,X1,2)) S:$E(X2)=" " X2=$E(X2,2,99)
|
---|
| 81 | S Y=$S($E(X2,1,2)="MO":"L",'$L(X2):"D",1:$E(X2))_X1
|
---|
| 82 | HDQ Q Y
|
---|
| 83 | ;
|
---|
| 84 | IV ; -- new IV Meds order
|
---|
| 85 | N SOLN,VOL,ADDS,STR,UNITS,RATE,URG,WP,QT,I,X1,X2,INST
|
---|
| 86 | N IVLIMIT ; duratioin or total volume for IV order
|
---|
| 87 | S IVLIMIT=$$PTR("DURATION")
|
---|
| 88 | S RATE=$$PTR("INFUSION RATE"),ADDS=$$PTR("ADDITIVE")
|
---|
| 89 | S STR=$$PTR("STRENGTH PSIV"),UNITS=$$PTR("UNITS")
|
---|
| 90 | S WP=$$PTR("WORD PROCESSING 1"),VOL=$$PTR("VOLUME")
|
---|
| 91 | S SOLN=$$PTR("ORDERABLE ITEM"),URG=+$G(ORDIALOG($$PTR("URGENCY"),1))
|
---|
| 92 | S QT=U_$G(ORDIALOG(+$$PTR("SCHEDULE"),1))_"^^^^"
|
---|
| 93 | S:URG QT=QT_$P($G(^ORD(101.42,URG,0)),U,2) S $P(ORMSG(4),"|",8)=QT
|
---|
| 94 | S X=$G(^OR(100,IFN,8,1,0)) I $P(X,U,5),$P(X,U,5)'=$P(X,U,3) S $P(ORMSG(4),"|",13)=$P(X,U,5) ; Send signer instead of orderer if different
|
---|
| 95 | S RATE=$G(ORDIALOG(RATE,1)) S:$E(RATE,$L(RATE))=" " RATE=$E(RATE,1,($L(RATE)-1)) S ORMSG(5)="RXO|^^^PS-1^IV^99OTH|"_RATE ;strip any trailing spaces
|
---|
| 96 | S IVLIMIT=$G(ORDIALOG(IVLIMIT,1))
|
---|
| 97 | I $L(IVLIMIT) S IVLIMIT=$$HL7IVLMT(IVLIMIT),ORMSG(5)="RXO|^^"_IVLIMIT_"^PS-1^IV^99OTH|"_RATE
|
---|
| 98 | S I=5 I $L($G(ORDIALOG(WP,1))) D
|
---|
| 99 | . N J,K S J=$O(^TMP("ORWORD",$J,WP,1,0)) Q:'J
|
---|
| 100 | . S I=6,ORMSG(6)="NTE|6|P|"_$G(^TMP("ORWORD",$J,WP,1,J,0))
|
---|
| 101 | . S K=0 F S J=$O(^TMP("ORWORD",$J,WP,1,J)) Q:J'>0 S K=K+1,ORMSG(6,K)=^(J,0)
|
---|
| 102 | IV1 S INST=0 F S INST=$O(ORDIALOG(SOLN,INST)) Q:INST'>0 D
|
---|
| 103 | . S X1="B",X2=+$G(ORDIALOG(SOLN,INST))
|
---|
| 104 | . I $P($G(^ORD(101.43,X2,"PS")),U,4) S X1=X1_"A" ;pre-mix
|
---|
| 105 | . S I=I+1,ORMSG(I)="RXC|"_X1_"|"_$$USID^ORMBLD(X2)_"|"_$G(ORDIALOG(VOL,INST))_"|"_$$HL7UNIT("ML")
|
---|
| 106 | I $O(ORDIALOG(ADDS,0)) D
|
---|
| 107 | . S INST=0 F S INST=$O(ORDIALOG(ADDS,INST)) Q:INST'>0 D
|
---|
| 108 | . . S X1=$G(ORDIALOG(ADDS,INST)),X2=$G(ORDIALOG(UNITS,INST))
|
---|
| 109 | . . S I=I+1,ORMSG(I)="RXC|A|"_$$USID^ORMBLD(X1)_"|"_$G(ORDIALOG(STR,INST))_"|"_$$HL7UNIT(X2)
|
---|
| 110 | I $D(^OR(100,IFN,9)) D ORDCHKS
|
---|
| 111 | S I=I+1,ORMSG(I)=$$ZRX(IFN)
|
---|
| 112 | ; Create DG1 & ZCL segment(s) for Billing Awareness (BA) Project
|
---|
| 113 | D DG1^ORWDBA3($G(IFN),"I",I)
|
---|
| 114 | Q
|
---|
| 115 | ;
|
---|
| 116 | RXR(ROUTE) ; -- Returns RXR segment
|
---|
| 117 | N NAME S NAME=$$GET1^DIQ(51.2,+ROUTE_",",.01)
|
---|
| 118 | Q "RXR|^^^"_+ROUTE_U_NAME_"^99PSR"
|
---|
| 119 | ;
|
---|
| 120 | ZRX(IFN) ; -- Returns ZRX segment
|
---|
| 121 | N NATURE,TYPE,ORIG,PSORIG,ZRX
|
---|
| 122 | S TYPE=$P($G(^OR(100,IFN,3)),U,11),NATURE=$P($G(^(8,1,0)),U,12)
|
---|
| 123 | S:NATURE NATURE=$P($G(^ORD(100.02,+NATURE,0)),U,2) ;code
|
---|
| 124 | S PSORIG="" I (TYPE=1)!(TYPE=2) D
|
---|
| 125 | . S ORIG=$P($G(^OR(100,IFN,3)),U,5),PSORIG=$G(^OR(100,+ORIG,4))
|
---|
| 126 | . I PSORIG'>0 S PSORIG="",TYPE=0 ;edit of unreleased order
|
---|
| 127 | S ZRX="ZRX|"_PSORIG_"|"_NATURE_"|"_$S(TYPE=1:"E",TYPE=2:"R",1:"N")
|
---|
| 128 | I $G(OUTPT) S ZRX=ZRX_"|"_$G(ORDIALOG($$PTR("ROUTING"),1))_$S($L($P($G(^OR(100,ORIFN,8,1,2)),"^",3)):"|||1",1:"")
|
---|
| 129 | Q ZRX
|
---|
| 130 | ;
|
---|
| 131 | ZRN(IFN,ORMSG,I) ; -- Set ZRN segment
|
---|
| 132 | N ST,ZRN,J,K,TXT
|
---|
| 133 | S ORMSG(I)="ZRN|N|"
|
---|
| 134 | S ST=$$PTR("STATEMENTS")
|
---|
| 135 | I $L($G(ORDIALOG(ST,1))) D
|
---|
| 136 | . S J=$O(^TMP("ORWORD",$J,ST,1,0)) Q:'J
|
---|
| 137 | . S K=0,TXT=$G(^TMP("ORWORD",$J,ST,1,J,0))
|
---|
| 138 | . I $L(TXT) S K=K+1,ORMSG(I,K)=TXT
|
---|
| 139 | . F S J=$O(^TMP("ORWORD",$J,ST,1,J)) Q:J'>0 S TXT=$G(^(J,0)) D
|
---|
| 140 | . . I $L(TXT) S K=K+1,ORMSG(I,K)=TXT
|
---|
| 141 | Q
|
---|
| 142 | ;
|
---|
| 143 | ORDCHKS ; -- Include order checks in OBX segments
|
---|
| 144 | N OC,X,X1 S OC=0
|
---|
| 145 | F S OC=$O(^OR(100,IFN,9,OC)) Q:OC'>0 S X=$G(^(OC,0)),X1=$G(^(1)) D
|
---|
| 146 | . S I=I+1,ORMSG(I)="OBX|"_OC_"|TX|^^^"_+X_"^^99OCX||"_$S($L(X1):X1,1:$P(X,U,3))_"|||||||||"_$$FMTHL7^XLFDT($P(X,U,6))_"||"_$P(X,U,5)
|
---|
| 147 | . I $L($P(X,U,4)) S I=I+1,ORMSG(I)="NTE|"_OC_"|P|"_$P(X,U,4)
|
---|
| 148 | Q
|
---|
| 149 | ;
|
---|
| 150 | HL7UNIT(X) ; -- Return coded element for volume/strength units
|
---|
| 151 | N I,UNIT,Y
|
---|
| 152 | F I=1:1:$L(X) I $E(X,I)?1A Q ; first letter
|
---|
| 153 | S UNIT=$$UP^XLFSTR($E(X,I,$L(X))),Y=""
|
---|
| 154 | F I=1:1:13 S X=$P("ML^LITER^MCG^MG^GM^UNITS^IU^MEQ^MM^MU^THOUU^MG-PE^NANOGRAM","^",I) I UNIT=X S Y="^^^PSIV-"_I_U_UNIT_"^99OTH" Q
|
---|
| 155 | Q Y
|
---|
| 156 | ;
|
---|
| 157 | HL7TIME(X) ; -- Return HL7 formatted duration
|
---|
| 158 | N I,Y S Y=""
|
---|
| 159 | F I=1:1:$L(X) I $E(X,I)?1A S Y=$$UP^XLFSTR($E(X,I)) Q ; first letter
|
---|
| 160 | S Y=Y_+X
|
---|
| 161 | Q Y
|
---|
| 162 | ;
|
---|
| 163 | VER(IFN) ; -- Send msg for nurse-verified orders
|
---|
| 164 | N OR0,ORMSG S OR0=$G(^OR(100,+IFN,0)) Q:$P(OR0,U,12)'="I" ;Inpt only
|
---|
| 165 | S ORMSG(1)=$$MSH^ORMBLD("ORM","PS"),ORMSG(2)=$$PID^ORMBLD($P(OR0,U,2))
|
---|
| 166 | S ORMSG(3)=$$PV1^ORMBLD($P(OR0,U,2),$P(OR0,U,12),+$P(OR0,U,10))
|
---|
| 167 | S ORMSG(4)="ORC|ZV|"_IFN_"^OR|"_$G(^OR(100,+IFN,4))_"^PS||||||||"_DUZ_"||||"_$$FMTHL7^XLFDT($$NOW^XLFDT)
|
---|
| 168 | D MSG^XQOR("OR EVSEND PS",.ORMSG)
|
---|
| 169 | Q
|
---|
| 170 | ;
|
---|
| 171 | REF(IFN,ROUTING,CLINIC) ; -- Send msg for refill request
|
---|
| 172 | N OR0,ORMSG S OR0=$G(^OR(100,+IFN,0)) Q:$P(OR0,U,12)'="O"
|
---|
| 173 | S:'$G(CLINIC) CLINIC=$S($G(ORL):+ORL,1:+$P(OR0,U,10))
|
---|
| 174 | S ORMSG(1)=$$MSH^ORMBLD("ORM","PS"),ORMSG(2)=$$PID^ORMBLD($P(OR0,U,2))
|
---|
| 175 | S ORMSG(3)=$$PV1^ORMBLD($P(OR0,U,2),"O",CLINIC)
|
---|
| 176 | S ORMSG(4)="ORC|ZF|"_IFN_"^OR|"_$G(^OR(100,+IFN,4))_"^PS|||||||"_DUZ_"||"_$G(ORNP)_"|||"_$$FMTHL7^XLFDT($$NOW^XLFDT)
|
---|
| 177 | S ORMSG(5)="ZRX||||"_ROUTING
|
---|
| 178 | D MSG^XQOR("OR EVSEND PS",.ORMSG)
|
---|
| 179 | Q
|
---|
| 180 | HL7IVLMT(STR) ;
|
---|
| 181 | N VAL,UNIT,IVLMT,TVAL,LEN
|
---|
| 182 | S (UNIT,IVLMT)="",VAL=0
|
---|
| 183 | I $E($$LOW^XLFSTR(STR))="f" D
|
---|
| 184 | . S VAL=$P(STR," ",2)
|
---|
| 185 | . S UNIT=$E($P(STR," ",3))
|
---|
| 186 | I $E($$LOW^XLFSTR(STR))="w" D
|
---|
| 187 | . S TVAL=$P(STR," ",4) ;pull data in total example 0.5ml
|
---|
| 188 | . S VAL=+TVAL ;this will strip out leading zero and alpha 00.5L becomes .5 or 05.5 becomes 5.5
|
---|
| 189 | . S LEN=$F(TVAL,VAL) ;get length up to alphas or trailing zeros
|
---|
| 190 | . I $P(VAL,".")="" S VAL=0_VAL ;make sure decimal values have only one leading zero .5 becomes 0.5.
|
---|
| 191 | . F S UNIT=$E(TVAL,LEN) Q:((UNIT'=0)&(UNIT'=".")) D ;get first alpha m or l
|
---|
| 192 | . . S LEN=LEN+1
|
---|
| 193 | I $L(UNIT),$L(VAL) S IVLMT=$$LOW^XLFSTR(UNIT)_VAL
|
---|
| 194 | Q IVLMT
|
---|
| 195 | ;
|
---|