| 1 | ORMBLD ; SLC/MKB/JDL - Build outgoing ORM msgs ;4/12/04  12:33 | 
|---|
| 2 | ;;3.0;ORDER ENTRY/RESULTS REPORTING;**3,33,26,45,79,97,133,168,187,190,195,215**;Dec 17, 1997 | 
|---|
| 3 | ; | 
|---|
| 4 | NEW(IFN,CODE) ; -- Send NW order message to pkg | 
|---|
| 5 | ;I $P($G(^ORD(101.42,+$$VALUE^ORCSAVE2(IFN,"URGENCY"),0)),U)="DONE" D STATUS^ORCSAVE2(IFN,2) Q  ; complete -> don't send to pkg | 
|---|
| 6 | N ORPKG,ORMSG,DGQUIET K ^TMP("ORWORD",$J) | 
|---|
| 7 | S DGQUIET=1 D  Q:'$O(ORMSG(0))  ;build msg, ORDIALOG gone when posted | 
|---|
| 8 | . N OR0,OR3,OR8,ORVP,ORDG,ORDIALOG,ORPARENT S:'$D(CODE) CODE="NW" | 
|---|
| 9 | . S OR0=$G(^OR(100,IFN,0)) Q:'$L(OR0)  S OR3=$G(^(3)),OR8=$G(^(8,1,0)) | 
|---|
| 10 | . S ORVP=$P(OR0,U,2),ORDG=$P(OR0,U,11),ORPKG=$$NMSP^ORCD($P(OR0,U,14)) | 
|---|
| 11 | . Q:"^GMRA^GMRC^FH^LR^PS^RA^OR^"'[(U_ORPKG_U) | 
|---|
| 12 | . S ORDIALOG=+$P(OR0,U,5) Q:'ORDIALOG | 
|---|
| 13 | . D GETDLG1^ORCD(ORDIALOG),GETORDER^ORCD(IFN) | 
|---|
| 14 | . S ORMSG(1)=$$MSH("ORM",ORPKG),ORMSG(2)=$$PID(ORVP) | 
|---|
| 15 | . S ORMSG(3)=$$PV1(ORVP,$P(OR0,U,12),+$P(OR0,U,10),"",$P(OR0,U,18)) | 
|---|
| 16 | . S ORPARENT=$P(OR3,U,9) I ORPARENT,$G(ORDIALOG($$PTR^ORCD("OR GTX SCHEDULE"),1))="NOW"!'$O(^OR(100,+ORPARENT,4.5,"ID","CONJ",0)) S ORPARENT="" ;no parent if NOW or only child | 
|---|
| 17 | . S ORMSG(4)="ORC|"_CODE_"|"_+OR0_";1^OR||||||"_ORPARENT_"|"_$$HL7DATE($P(OR0,U,7))_"|"_+$P(OR0,U,6)_"||"_+$P(OR0,U,4)_"|||"_$$HL7DATE($$NOW^XLFDT)_"|"_$$NATURE($P(OR8,U,12))_"^^^" | 
|---|
| 18 | . D @ORPKG K ^TMP("ORWORD",$J) | 
|---|
| 19 | I $G(ORZTEST) M ORZTEST=ORMSG Q  ;testing only | 
|---|
| 20 | D MSG^XQOR("OR EVSEND "_ORPKG,.ORMSG) | 
|---|
| 21 | Q | 
|---|
| 22 | ; | 
|---|
| 23 | MSG(IFN,CODE,REASON) ; -- Send all other order msgs | 
|---|
| 24 | N ORPKG,ORMSG,DGQUIET K ^TMP("ORWORD",$J) | 
|---|
| 25 | S DGQUIET=1 D  Q:'$O(ORMSG(0))  ; build message | 
|---|
| 26 | . N OR0,OR8,DG,PKGID,I,TYPE,DA,PROV,NATR,STS,OI | 
|---|
| 27 | . S OR0=$G(^OR(100,+IFN,0)),PKGID=$G(^(4)),STS=$P($G(^(3)),U,3) | 
|---|
| 28 | . S ORPKG=$$NMSP^ORCD($P(OR0,U,14)) | 
|---|
| 29 | . I ORPKG="VBEC" D:$L($T(CA^ORMBLDVB)) CA^ORMBLDVB(IFN,$G(REASON)) Q | 
|---|
| 30 | . Q:"^GMRA^GMRC^FH^LR^PS^RA^OR^"'[(U_ORPKG_U) | 
|---|
| 31 | . I ORPKG="LR" S ORPKG="LRCH" S:CODE="DC" CODE="CA" ;DC if VBEC child | 
|---|
| 32 | . S DA=+$P(IFN,";",2),OR8=$G(^OR(100,+IFN,8,DA,0)) | 
|---|
| 33 | . S PROV=$P(OR8,U,3),NATR=$P(OR8,U,12) S:'PROV PROV=$G(ORNP) | 
|---|
| 34 | . S TYPE=$S(CODE="NA"!(CODE="DE"):"ORR",1:"ORM") | 
|---|
| 35 | . S ORMSG(1)=$$MSH(TYPE,ORPKG),ORMSG(2)=$$PID($P(OR0,U,2)),I=2 | 
|---|
| 36 | . I ORPKG="PS"!(ORPKG="FH"&($P(OR0,U,12)="O")) S I=I+1,ORMSG(I)=$$PV1($P(OR0,U,2),$P(OR0,U,12),+$P(OR0,U,10)) | 
|---|
| 37 | . S I=I+1,ORMSG(I)="ORC|"_CODE_"|"_IFN_"^OR|"_PKGID_U_ORPKG_"||||||"_$S($G(DGPMA):$$HL7DATE($P(DGPMA,U)),1:"")_"|"_DUZ_"||"_PROV_"|||"_$$HL7DATE($$NOW^XLFDT)_"|"_$$REASON(+$G(REASON),NATR) | 
|---|
| 38 | . I ORPKG="FH",CODE="SS" S $P(ORMSG(I),"|",6)=$S(STS=8:"SC",STS=6:"IP",1:"") | 
|---|
| 39 | . I $E(ORPKG,1,2)="LR" S OI=+$O(^OR(100,+IFN,.1,0)),OI=+$G(^(OI,0)) S:OI I=I+1,ORMSG(I)="OBR||||"_$$USID(OI) | 
|---|
| 40 | . I $P(^ORD(100.98,$P(OR0,U,11),0),U)="NON-VA MEDICATIONS" D | 
|---|
| 41 | . . I (CODE="CA")!(CODE="DC") S I=I+1,ORMSG(I)="ZRN|N" | 
|---|
| 42 | . K ^TMP("ORWORD",$J) | 
|---|
| 43 | D MSG^XQOR("OR EVSEND "_ORPKG,.ORMSG) | 
|---|
| 44 | Q | 
|---|
| 45 | ; | 
|---|
| 46 | BHS(PAT) ; -- Send batch header segment/message to Lab | 
|---|
| 47 | N ORMSG S ORMSG(1)="BHS|^~\&|ORDER ENTRY|"_$G(DUZ(2))_"|LABORATORY|"_$G(DUZ(2))_"|"_$$HL7DATE($$NOW^XLFDT) | 
|---|
| 48 | S ORMSG(2)=$$PID($G(PAT)) | 
|---|
| 49 | D MSG^XQOR("OR EVSEND LRCH",.ORMSG) | 
|---|
| 50 | Q | 
|---|
| 51 | ; | 
|---|
| 52 | BTS(PAT) ; -- Send batch trailer segment/message to Lab | 
|---|
| 53 | N ORMSG S ORMSG(1)="BTS",ORMSG(2)=$$PID($G(PAT)) | 
|---|
| 54 | D MSG^XQOR("OR EVSEND LRCH",.ORMSG) | 
|---|
| 55 | Q | 
|---|
| 56 | ; | 
|---|
| 57 | MSH(TYPE,TO) ; -- MSH segment | 
|---|
| 58 | N MSH | 
|---|
| 59 | S MSH="MSH|^~\&|ORDER ENTRY|"_$G(DUZ(2))_"|"_$$NAME(TO)_"|"_$G(DUZ(2))_"|"_$$HL7DATE($$NOW^XLFDT)_"||"_TYPE | 
|---|
| 60 | Q MSH | 
|---|
| 61 | ; | 
|---|
| 62 | NAME(NMSP) ; -- Returns name of pkg NMSP | 
|---|
| 63 | I NMSP="GMRA" Q "ALLERGIES" | 
|---|
| 64 | I NMSP="GMRC" Q "CONSULTS" | 
|---|
| 65 | I NMSP="FH" Q "DIETETICS" | 
|---|
| 66 | I NMSP?1"LR".E Q "LABORATORY" | 
|---|
| 67 | I NMSP="PS" Q "PHARMACY" | 
|---|
| 68 | I NMSP="RA" Q "RADIOLOGY" | 
|---|
| 69 | I NMSP="OR" Q "ORDER ENTRY" | 
|---|
| 70 | Q "" | 
|---|
| 71 | ; | 
|---|
| 72 | PID(DFN) ; -- PID segment | 
|---|
| 73 | N PID,PTR,ROOT | 
|---|
| 74 | S PTR=+$P(DFN,";"),ROOT=$P(DFN,";",2),PID="PID|||" | 
|---|
| 75 | I ROOT="DPT(" S PID=PID_PTR_"||"_$P($G(^DPT(PTR,0)),U) | 
|---|
| 76 | E  S PID=PID_"|"_DFN_"|"_$S($L(ROOT):$P($G(@(U_ROOT_PTR_",0)")),U),1:"") | 
|---|
| 77 | Q PID | 
|---|
| 78 | ; | 
|---|
| 79 | PV1(OBJ,TYPE,LOC,VISIT,APPTDT) ; -- PV1 segment | 
|---|
| 80 | N PV1,RB,PACH S RB="" | 
|---|
| 81 | S:$G(APPTDT) APPTDT=$$FMTHL7^XLFDT(APPTDT) | 
|---|
| 82 | I TYPE="I",+OBJ,$P(OBJ,";",2)="DPT(" S RB=$P($G(^DPT(+OBJ,.101)),U) | 
|---|
| 83 | S PACH=$$PATCH^XPDUTL("PSJ*5.0*111") | 
|---|
| 84 | S:PACH PV1="PV1||"_TYPE_"|"_LOC_$S($L(RB):U_RB,1:"")_"||||||||||||||||"_$G(VISIT)_"|||||||||||||||||||||||||"_$G(APPTDT) | 
|---|
| 85 | S:'PACH PV1="PV1||"_TYPE_"|"_LOC_$S($L(RB):U_RB,1:"")_"||||||||||||||||"_$G(VISIT) | 
|---|
| 86 | Q PV1 | 
|---|
| 87 | ; | 
|---|
| 88 | HL7DATE(DATE) ; -- FM -> HL7 format | 
|---|
| 89 | Q $$FMTHL7^XLFDT(DATE)  ;**97 | 
|---|
| 90 | ; | 
|---|
| 91 | USID(OI) ; -- Returns Univ Serv ID for Orderable Item | 
|---|
| 92 | N OITEM,NATL,LOCAL S OITEM=$G(^ORD(101.43,+OI,0)) | 
|---|
| 93 | S NATL=$P(OITEM,U,3)_U_U_$P(OITEM,U,4) | 
|---|
| 94 | S LOCAL=$P($P(OITEM,U,2),";")_U_$P(OITEM,U)_U_$P($P(OITEM,U,2),";",2) | 
|---|
| 95 | Q NATL_U_LOCAL | 
|---|
| 96 | ; | 
|---|
| 97 | NATURE(X) ; -- Returns 3 ^-piece identifier for nature X | 
|---|
| 98 | N ORN,Y S ORN=$G(^ORD(100.02,+$G(X),0)) | 
|---|
| 99 | S Y=$P(ORN,U,2)_U_$P(ORN,U)_"^99ORN" | 
|---|
| 100 | Q Y | 
|---|
| 101 | ; | 
|---|
| 102 | REASON(X,N) ; -- Returns 6 ^-piece format of reason X | 
|---|
| 103 | ;    N ^ NATURE ^ 99ORN ^ # ^ Reason ^ 99ORR | 
|---|
| 104 | N Y,ORR S ORR=$G(^ORD(100.03,+$G(X),0)) | 
|---|
| 105 | S:'$G(N) N=+$P(ORR,U,7) S Y=$$NATURE(N) | 
|---|
| 106 | S:$G(X) Y=Y_U_$S(ORPKG'="RA":+X,1:"")_U_$P(ORR,U)_"^99ORR" | 
|---|
| 107 | Q Y | 
|---|
| 108 | ; | 
|---|
| 109 | IP() ; -- Returns ORIFN^Type if pt has active isolation order (or 0 if not) | 
|---|
| 110 | N TYPE,START,ORIFN,Y | 
|---|
| 111 | S TYPE=$O(^ORD(100.98,"B","PREC",0)),START=$$NOW^XLFDT,Y=0 | 
|---|
| 112 | F  S START=$O(^OR(100,"AW",ORVP,TYPE,START),-1) Q:START'>0  S ORIFN=$O(^(START,0)) I $P($G(^OR(100,ORIFN,3)),U,3)=6 S Y=ORIFN Q | 
|---|
| 113 | I Y S TYPE=$$VALUE^ORCSAVE2(ORIFN,"ISOLATION"),Y=Y_U_$$GET1^DIQ(119.4,+TYPE_",",.01) | 
|---|
| 114 | Q Y | 
|---|
| 115 | ; | 
|---|
| 116 | OR ; -- new Generic order | 
|---|
| 117 | I ORDG=$O(^ORD(100.98,"B","M.A.S.",0)) D ADT^ORMBLDOR Q | 
|---|
| 118 | D EN^ORMBLDOR | 
|---|
| 119 | Q | 
|---|
| 120 | ; | 
|---|
| 121 | GMRA ; -- new Allergy order | 
|---|
| 122 | Q:$$PATCH^XPDUTL("OR*3.0*216")  ;195 quit if patch 216 is in | 
|---|
| 123 | D:$L($T(ALG^ORMBLDAL)) ALG^ORMBLDAL | 
|---|
| 124 | Q | 
|---|
| 125 | ; | 
|---|
| 126 | GMRC ; -- new Consult order | 
|---|
| 127 | D CSLT^ORMBLDGM | 
|---|
| 128 | Q | 
|---|
| 129 | ; | 
|---|
| 130 | FH ; -- new Diet order | 
|---|
| 131 | N ORPARAM D EN^FHWOR8(+ORVP,.ORPARAM) ; set parameters | 
|---|
| 132 | S:'$L($G(ORPARAM(3))) ORPARAM(3)="T" | 
|---|
| 133 | I ORDG=$O(^ORD(100.98,"B","PRECAUTIONS",0)) D IP^ORMBLDFH Q | 
|---|
| 134 | I ORDG=$O(^ORD(100.98,"B","EARLY/LATE TRAYS",0)) D TRAY^ORMBLDFH Q | 
|---|
| 135 | I ORDG=$O(^ORD(100.98,"B","TUBEFEEDINGS",0)) D TF^ORMBLDFH Q | 
|---|
| 136 | I ORDG=$O(^ORD(100.98,"B","DIET ADDITIONAL ORDERS",0)) D ADDN^ORMBLDFH Q | 
|---|
| 137 | D DIET^ORMBLDFH | 
|---|
| 138 | Q | 
|---|
| 139 | ; | 
|---|
| 140 | LR ; -- new Lab order | 
|---|
| 141 | I CODE="XO" D XO^ORMBLDLR Q  ; change | 
|---|
| 142 | D CH^ORMBLDLR S ORPKG="LRCH" Q  ;no difference by subscript at this time | 
|---|
| 143 | N SUB S SUB=$P($G(^ORD(100.98,ORDG,0)),U,3) | 
|---|
| 144 | S:(SUB="SP")!(SUB="EM")!(SUB="AU")!(SUB="CY") SUB="AP" | 
|---|
| 145 | S:(SUB="LAB")!(SUB="MI")!(SUB="HEMA") SUB="CH" | 
|---|
| 146 | D @(SUB_"^ORMBLDLR") S ORPKG=ORPKG_SUB | 
|---|
| 147 | Q | 
|---|
| 148 | ; | 
|---|
| 149 | PS ; -- new Pharmacy order | 
|---|
| 150 | ;I ORDG=$O(^ORD(100.98,"B","OUTPATIENT MEDICATIONS",0)) D OUT^ORMBLDPS Q | 
|---|
| 151 | ;D UD^ORMBLDPS | 
|---|
| 152 | N IVDLG S IVDLG=+$P(OR0,U,5) ;JD | 
|---|
| 153 | N PKG S PKG=$P(OR0,U,14),PKG=$$GET1^DIQ(9.4,+PKG_",",1) | 
|---|
| 154 | I +$$VALUE^ORCSAVE2(IFN,"URGENCY")=99,$P(OR3,U,11)'="B" D  Q  ;only send DONE orders from BCMA | 
|---|
| 155 | . D STATUS^ORCSAVE2(IFN,2) K ORMSG | 
|---|
| 156 | . I $P(OR3,U,11)=1,$P($G(^OR(100,+$P(OR3,U,5),3)),U,3)=5 D MSG(+$P(OR3,U,5),"CA") ;cancel original instead | 
|---|
| 157 | I ORDG=$O(^ORD(100.98,"B","IV RX",0))!(ORDG=$O(^ORD(100.98,"B","TPN",0)))!(IVDLG=$O(^ORD(101.41,"B","PSJI OR PAT FLUID OE",0))) D IV^ORMBLDPS Q | 
|---|
| 158 | D @($S(PKG="PSIV":"IV",PKG="PSO":"OUT",PKG="PSH":"NVA",1:"UD")_"^ORMBLDPS") | 
|---|
| 159 | Q | 
|---|
| 160 | ; | 
|---|
| 161 | RA ; -- new Radiology order | 
|---|
| 162 | D EN^ORMBLDRA | 
|---|
| 163 | Q | 
|---|
| 164 | ; | 
|---|
| 165 | TEST(ORIFN) ; -- Build/display HL7 msgs w/o sending | 
|---|
| 166 | K ORZTEST S ORZTEST=1 D NEW(ORIFN) ; leaves msg in ORZTEST() on exit | 
|---|
| 167 | Q | 
|---|