| 1 | ORM ; SLC/MKB/JDL - ORM msg router ;11/17/00  10:58
 | 
|---|
| 2 |  ;;3.0;ORDER ENTRY/RESULTS REPORTING;**3,97,141,187,195**;Dec 17, 1997
 | 
|---|
| 3 | EN(MSG) ; -- main entry point for OR RECEIVE where MSG contains HL7 msg
 | 
|---|
| 4 |  N ORMSG,ORNMSP,ORTYPE,MSH,PID,PV1,ORC,ORVP,ORTS,ORL,ORCAT,ORAPPT
 | 
|---|
| 5 |  S ORAPPT="",ORL=0
 | 
|---|
| 6 |  S ORMSG=$S($L($G(MSG)):MSG,1:"MSG") ; MSG="NAME" or MSG(#)=message
 | 
|---|
| 7 |  I '$O(@ORMSG@(0)) D EN^ORERR("Missing HL7 message",.ORMSG) Q
 | 
|---|
| 8 |  S MSH=0 F  S MSH=$O(@ORMSG@(MSH)) Q:MSH'>0  Q:$E(@ORMSG@(MSH),1,3)="MSH"
 | 
|---|
| 9 |  I 'MSH D EN^ORERR("Missing or invalid MSH segment",.ORMSG) Q
 | 
|---|
| 10 |  S ORNMSP=$$NMSP($P(@ORMSG@(MSH),"|",3)),ORTYPE=$P(@ORMSG@(MSH),"|",9)
 | 
|---|
| 11 |  I '$L(ORNMSP) D EN^ORERR("Missing or invalid sending application",.ORMSG) Q
 | 
|---|
| 12 |  D PID I '$G(ORVP) D EN^ORERR("Missing or invalid patient ID",.ORMSG) Q
 | 
|---|
| 13 |  D PV1 S ORC=PID
 | 
|---|
| 14 | EN1 F  S ORC=$O(@ORMSG@(+ORC)) Q:ORC'>0  I $E(@ORMSG@(ORC),1,3)="ORC" D
 | 
|---|
| 15 |  . N ORDCNTRL,ORDSTS,PKGIFN,ORIFN,ORNP,ORTN,ORERR,ORLOG,ORDUZ,ORQT,ORSTRT,ORSTOP,ORURG,ORNATR,OREASON
 | 
|---|
| 16 |  . S ORC=ORC_U_@ORMSG@(ORC),ORDCNTRL=$TR($P(ORC,"|",2),"@","P")
 | 
|---|
| 17 |  . I '$L(ORDCNTRL) S ORERR="Invalid control code" D ERROR Q
 | 
|---|
| 18 |  . S ORIFN=$P($P(ORC,"|",3),U),PKGIFN=$P($P(ORC,"|",4),U)
 | 
|---|
| 19 |  . I ORIFN,$D(^OR(100,+ORIFN,0)),$P(^(0),U,2)'=ORVP S ORERR="Patient doesn't match" D ERROR Q
 | 
|---|
| 20 |  . S ORDSTS=$P(ORC,"|",6),ORQT=$P(ORC,"|",8)
 | 
|---|
| 21 |  . S ORSTRT=$$FMDATE($P(ORQT,U,4)),ORSTOP=$$FMDATE($P(ORQT,U,5))
 | 
|---|
| 22 |  . S ORURG=$$URGENCY($P(ORQT,U,6)),ORLOG=$$FMDATE($P(ORC,"|",10))
 | 
|---|
| 23 |  . S ORDUZ=+$P(ORC,"|",11),ORNP=+$P(ORC,"|",13),OREASON=$P(ORC,"|",17)
 | 
|---|
| 24 |  . S ORNATR=$S($P(OREASON,U,3)="99ORN":$P(OREASON,U),1:"")
 | 
|---|
| 25 |  . S ORTN="EN^ORM"_ORNMSP D @ORTN I $D(ORERR) D ERROR Q
 | 
|---|
| 26 |  . I ORDCNTRL="SN",$G(ORIFN) D MSG^ORMBLD(ORIFN,"NA")
 | 
|---|
| 27 |  . I $G(DGPMT),ORDCNTRL="OD"!(ORDCNTRL="OC") D XTMP
 | 
|---|
| 28 |  Q
 | 
|---|
| 29 |  ;
 | 
|---|
| 30 | NMSP(NAME) ; -- Returns pkg namespace
 | 
|---|
| 31 |  I NAME="RADIOLOGY"!(NAME="IMAGING") Q "RA"
 | 
|---|
| 32 |  I NAME="LABORATORY" Q "LR"
 | 
|---|
| 33 |  I NAME="DIETETICS" Q "FH"
 | 
|---|
| 34 |  I NAME="PHARMACY" Q "PS"
 | 
|---|
| 35 |  I NAME="CONSULTS" Q "GMRC"
 | 
|---|
| 36 |  I NAME="PROCEDURES" Q "GMRC"
 | 
|---|
| 37 |  I NAME="ORDER ENTRY" Q "ORG"
 | 
|---|
| 38 |  Q ""
 | 
|---|
| 39 |  ;
 | 
|---|
| 40 | PID ; -- Returns patient from PID segment in current msg
 | 
|---|
| 41 |  ;    Sets PID, ORVP, ORTS if valid patient
 | 
|---|
| 42 |  N I,DFN,SEG S I=MSH,PID=""
 | 
|---|
| 43 |  F  S I=$O(@ORMSG@(I)) Q:I'>0  S SEG=$E(@ORMSG@(I),1,3) Q:SEG="ORC"  I SEG="PID" D  Q
 | 
|---|
| 44 |  . S DFN=+$P(@ORMSG@(I),"|",4),PID=I
 | 
|---|
| 45 |  . I $D(^DPT(DFN,0)) S ORVP=DFN_";DPT(",ORTS=$G(^DPT(DFN,.103)) Q
 | 
|---|
| 46 |  . S:$L($P(@ORMSG@(I),"|",5)) ORVP=$P(@ORMSG@(I),"|",5) ; alt ID for Lab
 | 
|---|
| 47 |  Q
 | 
|---|
| 48 |  ;
 | 
|---|
| 49 | PV1 ; -- Returns patient location in PV1 segment in current msg
 | 
|---|
| 50 |  ;    Sets PV1, ORCAT, & ORL if valid location, ORAPPT: IMO appointment
 | 
|---|
| 51 |  N I,X,SEG S I=PID,PV1=""
 | 
|---|
| 52 |  F  S I=$O(@ORMSG@(I)) Q:I'>0  S SEG=$E(@ORMSG@(I),1,3) Q:SEG="ORC"  I SEG="PV1" D  Q
 | 
|---|
| 53 |  . S X=+$P(@ORMSG@(I),"|",4),ORCAT=$P(@ORMSG@(I),"|",3),PV1=I
 | 
|---|
| 54 |  . S:$D(^SC(X,0)) ORL=X_";SC("
 | 
|---|
| 55 |  . S ORAPPT=$P(@ORMSG@(I),"|",45)
 | 
|---|
| 56 |  . S:+$G(ORAPPT) ORAPPT=$$FMDATE($G(ORAPPT))
 | 
|---|
| 57 |  Q
 | 
|---|
| 58 |  ;
 | 
|---|
| 59 | ORDITEM(USID) ; -- Returns pointer to Orderable Item file for USID
 | 
|---|
| 60 |  N ID,OI
 | 
|---|
| 61 |  S ID=$P(USID,U,4)_";"_$P(USID,U,6)
 | 
|---|
| 62 |  S OI=+$O(^ORD(101.43,"ID",ID,0))
 | 
|---|
| 63 |  Q OI
 | 
|---|
| 64 |  ;
 | 
|---|
| 65 | URGENCY(CODE) ; -- Return ptr to Order Urgency file #101.42
 | 
|---|
| 66 |  S:'$L(CODE) CODE="R"
 | 
|---|
| 67 |  Q $O(^ORD(101.42,"C",CODE,0))
 | 
|---|
| 68 |  ;
 | 
|---|
| 69 | FMDATE(Y) ; -- Convert HL7 date/time to FM format
 | 
|---|
| 70 |  Q $$HL7TFM^XLFDT(Y)  ;**97
 | 
|---|
| 71 |  ;
 | 
|---|
| 72 | ERROR ; -- Sends a DE reply to current msg
 | 
|---|
| 73 |  ; Uses ORVP, ORNMSP, ORDUZ, ORIFN, ORERR, and PKGIFN
 | 
|---|
| 74 |  N ORV S ORV("XQY0")="" D EN^ORERR(ORERR,.ORMSG,.ORV)
 | 
|---|
| 75 |  Q:ORTYPE="ORR"  Q:'$L($G(ORNMSP))
 | 
|---|
| 76 |  N OREMSG,ORVP,ORTS S:'$G(ORDUZ) ORDUZ=DUZ D:'$G(ORVP) PID
 | 
|---|
| 77 |  S OREMSG(1)=$$MSH^ORMBLD("ORR",ORNMSP),OREMSG(2)=$$PID^ORMBLD($G(ORVP))
 | 
|---|
| 78 |  S OREMSG(3)="ORC|DE|"_$S($G(ORIFN):ORIFN_"^OR",1:"")_"|"_$S($L($G(PKGIFN)):PKGIFN_U_ORNMSP,1:"")_"|||||||"_ORDUZ_"||||||"_ORERR
 | 
|---|
| 79 |  D MSG^XQOR("OR EVSEND "_ORNMSP,.OREMSG)
 | 
|---|
| 80 |  Q
 | 
|---|
| 81 |  ;
 | 
|---|
| 82 | FIND(SEG,PIECE) ; -- Returns value in $P(@ORMSG@(SEG),"|",PIECE)
 | 
|---|
| 83 |  N X,Y,FLDS,I,DONE
 | 
|---|
| 84 |  S X=$G(@ORMSG@(SEG)),FLDS=$L(X,"|"),Y="",(I,DONE)=0
 | 
|---|
| 85 |  F  D  Q:DONE
 | 
|---|
| 86 |  . I PIECE<FLDS S Y=$P(X,"|",PIECE),DONE=1 Q
 | 
|---|
| 87 |  . I PIECE=FLDS D  Q
 | 
|---|
| 88 |  . . S Y=$P(X,"|",PIECE),I=$O(@ORMSG@(SEG,I)),DONE=1
 | 
|---|
| 89 |  . . I I S Y=Y_$P($G(@ORMSG@(SEG,I)),"|")
 | 
|---|
| 90 |  . S I=$O(@ORMSG@(SEG,I)) I 'I S Y="",DONE=1 Q
 | 
|---|
| 91 |  . S PIECE=PIECE-(FLDS-1),X=$G(@ORMSG@(SEG,I)),FLDS=$L(X,"|")
 | 
|---|
| 92 | FQ Q Y
 | 
|---|
| 93 |  ;
 | 
|---|
| 94 | XTMP ; -- Save package auto-dc'd order numbers in ^XTMP
 | 
|---|
| 95 |  ;    Uses ORIFN, ORNMSP
 | 
|---|
| 96 |  Q:'$G(ORIFN)  Q:"^1^13^"'[($P($G(^OR(100,+ORIFN,3)),U,3)_U)
 | 
|---|
| 97 |  N ORNOW,ORDC S ORNOW=+$$NOW^XLFDT,ORDC="ORDC-"_$G(DGPMDA)
 | 
|---|
| 98 |  I $G(^XTMP(ORDC,0)),+^(0)<ORNOW K ^XTMP(ORDC)
 | 
|---|
| 99 |  I '$G(^XTMP(ORDC,0)) D
 | 
|---|
| 100 |  . N ORNOW1H S ORNOW1H=$$FMADD^XLFDT(ORNOW,,1)
 | 
|---|
| 101 |  . S ^XTMP(ORDC,0)=ORNOW1H_U_ORNOW_"^Orders AutoDC'd by Packages on Discharge"
 | 
|---|
| 102 |  S ^XTMP(ORDC,+ORIFN)=$G(ORNMSP)
 | 
|---|
| 103 |  Q
 | 
|---|