1 | RGHLUT ;CAIRO/DKM-HL7 message processing utilities ;04-Sep-1998
|
---|
2 | ;;1.0; CLINICAL INFO RESOURCE NETWORK ;;30 Apr 99
|
---|
3 | ;=================================================================
|
---|
4 | ; Converts HL7 style date/time to FileMan format.
|
---|
5 | DTHF(RGDT) ;
|
---|
6 | Q:RGDT="" ""
|
---|
7 | Q $$FMDATE^HLFNC(RGDT)
|
---|
8 | ; Converts Fileman style date/time to HL7 format.
|
---|
9 | DTFH(RGDT,RGTZ) ;
|
---|
10 | Q:RGDT="" ""
|
---|
11 | S RGTZ=$S('(RGDT#1):"",$G(RGTZ):$$TZ(RGDT,1),1:"")
|
---|
12 | S:RGDT>1 RGDT=RGDT+17000000
|
---|
13 | S:RGDT#1 RGDT=RGDT*10000
|
---|
14 | S:RGDT#1 RGDT=RGDT*100\1
|
---|
15 | Q RGDT_RGTZ
|
---|
16 | ; Get time zone offset for this site
|
---|
17 | TZ(RGDT,RGHL) ;
|
---|
18 | N RGTZ,RGSN
|
---|
19 | S RGTZ=$P($G(^RGSITE("COR",1,"TZ")),U,1+$$ISDST(.RGDT))
|
---|
20 | S:'RGTZ RGTZ=+$G(^RGSITE("COR",1,"TZ"))
|
---|
21 | S RGTZ=$P($G(^XMB(4.4,RGTZ,0)),U,3)
|
---|
22 | Q:RGTZ=""!'$G(RGHL) RGTZ
|
---|
23 | I RGTZ<0 S RGSN="-",RGTZ=-RGTZ
|
---|
24 | E S RGSN="+"
|
---|
25 | Q RGSN_$E(RGTZ\1+100,2,3)_$E(RGTZ#1*60\1+100,2,3)
|
---|
26 | ; Determine if FM date is during DST
|
---|
27 | ISDST(RGDAT) ;
|
---|
28 | N RGD1,RGD2,RGDY,RGYR
|
---|
29 | S:'$G(RGDAT) RGDAT=$$NOW^XLFDT
|
---|
30 | S RGYR=RGDAT\10000*10000
|
---|
31 | ; Find first Sunday in April of target year
|
---|
32 | S RGD1=+$$FMTH^XLFDT(RGYR+401),RGDY=RGD1#7
|
---|
33 | S RGD1=$$HTFM^XLFDT(RGD1+$S(RGDY>3:10-RGDY,1:3-RGDY))+.02
|
---|
34 | ; Find last Sunday in October of target year
|
---|
35 | S RGD2=+$$FMTH^XLFDT(RGYR+1031),RGDY=RGD2#7
|
---|
36 | S RGD2=$$HTFM^XLFDT(RGD2-$S(RGDY=3:0,RGDY>3:RGDY-3,1:4+RGDY))+.02
|
---|
37 | Q RGDAT'<RGD1&(RGDAT<RGD2)
|
---|
38 | ; Get ICN (convert if old format)
|
---|
39 | GETICN(RGDFN) ;
|
---|
40 | S RGDFN=$$GETICN^MPIF001(RGDFN)
|
---|
41 | Q $S(RGDFN?1.N1"^"1.N:$TR(RGDFN,U,"V"),1:RGDFN)
|
---|
42 | ; Get DFN from ICN
|
---|
43 | ICN2DFN(RGICN,RGCHK) ;
|
---|
44 | N RGDFN
|
---|
45 | S RGDFN=$$GETDFN^MPIF001(RGICN)
|
---|
46 | I RGDFN>0,$D(RGCHK) D
|
---|
47 | .S RGICN=$$GETICN(RGDFN)
|
---|
48 | .S RGDFN=$S(RGICN<0:RGICN,+$P(RGICN,"V",2)'=+RGCHK:"-1^INVALID ICN CHECKSUM",1:RGDFN)
|
---|
49 | Q RGDFN
|
---|
50 | ; Lookup institution, returning IEN
|
---|
51 | INST(RGINST) ;
|
---|
52 | Q +$$FIND1^DIC(4,,"MX",RGINST)
|
---|
53 | ; Convert HL7 suffix code to attribute
|
---|
54 | SFX2ATR(RGSFX) ;
|
---|
55 | Q:'$L(RGSFX) ""
|
---|
56 | S:RGSFX'=+RGSFX RGSFX=+$O(^RGHL7(991.7,"B",RGSFX,0))
|
---|
57 | Q $S(RGSFX:$P(^RGHL7(991.7,RGSFX,0),U,2),1:"")
|
---|
58 | ; HL7 <==> COR flag conversion
|
---|
59 | FLG(RGFLG,RGDLM,RGHL) ;
|
---|
60 | N RGZ,RGC,RGR
|
---|
61 | S RGHL=''$G(RGHL),RGR=""
|
---|
62 | F RGZ=1:1:$S(RGHL:$L(RGFLG,RGDLM),1:$L(RGFLG)) D
|
---|
63 | .S RGC=$S(RGHL:$P(RGFLG,RGDLM,RGZ),1:$E(RGFLG,RGZ))
|
---|
64 | .Q:RGC=""
|
---|
65 | .S RGC=$O(^RGHL7(991.2,$S(RGHL:"B",1:"AC"),RGC,0))
|
---|
66 | .Q:'RGC
|
---|
67 | .S RGC=$P(^RGHL7(991.2,RGC,0),U,RGHL+1)
|
---|
68 | .S:RGC'="" RGR=RGR_$S(RGR="":"",RGHL:"",1:RGDLM)_RGC
|
---|
69 | Q RGR
|
---|
70 | ; Parse fields from RGREC into target array RGFLD using delimiter RGD.
|
---|
71 | ; RGREC and RGFLD must be passed by reference.
|
---|
72 | FLD(RGREC,RGFLD,RGD) ;
|
---|
73 | N RGG,RGZ,RGI,RGJ,RGC
|
---|
74 | K RGFLD
|
---|
75 | S RGG="RGREC",RGC=0
|
---|
76 | F D Q:RGG=""
|
---|
77 | .S RGZ=$G(@RGG),RGJ=$L(RGZ,RGD)
|
---|
78 | .F RGI=1:1:RGJ S RGFLD(RGC)=$G(RGFLD(RGC))_$P(RGZ,RGD,RGI),RGC=RGC+(RGI'=RGJ)
|
---|
79 | .S RGG=$Q(@RGG)
|
---|
80 | Q
|
---|
81 | ; Parse MSH header
|
---|
82 | MSH(RGMSH,RGARY) ;
|
---|
83 | N RGZ
|
---|
84 | Q:$E(RGMSH,1,3)'="MSH" 0
|
---|
85 | S RGARY("FS")=$E(RGMSH,4)
|
---|
86 | F RGZ=2:1:7,9:1:12 D
|
---|
87 | .S RGARY($P("^ECH^SAN^SAF^RAN^RAF^DTM^^MTN^MID^PID^VER",U,RGZ))=$P(RGMSH,RGARY("FS"),RGZ)
|
---|
88 | S RGZ=$E(RGARY("ECH")),RGARY("ETN")=$P(RGARY("MTN"),RGZ,2),RGARY("MTN")=$P(RGARY("MTN"),RGZ)
|
---|
89 | Q 1
|
---|
90 | ; Convert HL7 escape codes
|
---|
91 | ESCAPE(RGTXT) ;
|
---|
92 | N RGZ,RGRTN
|
---|
93 | S RGRTN=""
|
---|
94 | F Q:RGTXT'[RGD(4) D
|
---|
95 | .S RGRTN=RGRTN_$P(RGTXT,RGD(4)),RGZ=$P(RGTXT,RGD(4),2),RGTXT=$P(RGTXT,RGD(4),3,999)
|
---|
96 | .I $L(RGZ)=1 D
|
---|
97 | ..S RGZ1=$F("FSRET",RGZ)-1
|
---|
98 | ..S:RGZ1>0 RGRTN=RGRTN_RGD(RGZ1)
|
---|
99 | .E I $E(RGZ)="X" D
|
---|
100 | ..F RGZ1=2:2:$L(RGZ) S RGRTN=RGRTN_$C($$BASE^XLFUTL($E(RGZ,RGZ1,RGZ1+1),16,10))
|
---|
101 | Q RGRTN_RGTXT
|
---|