| 1 | GMTSMCMA ; WAS/DCB\KER - Medicine 2.2 interface routine      ; 02/11/2003 [11/14/03 9:12am] | 
|---|
| 2 | ;;2.7;Health Summary;**4,47,49,61,62,69**;Oct 20, 1995 | 
|---|
| 3 | ; | 
|---|
| 4 | ; External Refernces | 
|---|
| 5 | ;    DBIA 10064  KILL^XM | 
|---|
| 6 | ;    DBIA 10070  ^XMD | 
|---|
| 7 | ;    DBIA  1236  $$HL7^MCORMN | 
|---|
| 8 | ;    DBIA  3778  HL1^MCORMN | 
|---|
| 9 | ;    DBIA 10090  ^DIC(4, | 
|---|
| 10 | ;    DBIA 10000  NOW^%DTC | 
|---|
| 11 | ;    DBIA 10106  $$HLDATE^HLFNC | 
|---|
| 12 | ;    DBIA 10106  $$HLNAME^HLFNC | 
|---|
| 13 | ;    DBIA 10017  ^DD("DD") | 
|---|
| 14 | ;    DBIA 10106  $$FMDATE^HLFNC | 
|---|
| 15 | ;    DBIA 10106  $$FMNAME^HLFNC | 
|---|
| 16 | ;    DBIA 10072  REMSBMSG^XMA1C | 
|---|
| 17 | ; | 
|---|
| 18 | HSUM(PATID,BDATE,EDATE,OCC,WH,ATYPE) ; Health Summary API | 
|---|
| 19 | N ARRAY,MESSAGE,MSH,HLECH,ST,ORD,MSTR,LOOP,MSTR,SAP,SNF,RAP,RNF,MST,PCI,VID | 
|---|
| 20 | N REC,LOC,QID,XDEST,WSF,MWDDC,WDC,QRL,BUILDER,LOOP,MESS1,MESS2,TMP,SUB | 
|---|
| 21 | N XMDUZ,XMTEXT,XMSUB,XMY,XMZ,XMDUN,GMTSG | 
|---|
| 22 | S GMTSG=0 S:$L($T(HL1^MCORMN))>1 GMTSG=1 | 
|---|
| 23 | S ARRAY="TMP(""HS"",$J)" | 
|---|
| 24 | S XMTEXT="TMP(""HS"",$J," | 
|---|
| 25 | S MSTR="|^~\&",HLECH=$E(MSTR,2,4) | 
|---|
| 26 | F LOOP=1:1:5 S ST(LOOP)=$E(MSTR,LOOP,LOOP) | 
|---|
| 27 | S MESSAGE="TMP",SAP="HEALTH SUMMARY",RAP="MEDICINE",VID=2.1 | 
|---|
| 28 | S REC=+$O(^DIC(4,"D",DUZ(2),"")),LOC=$P($G(^DIC(4,REC,0)),U,1) | 
|---|
| 29 | S (RNF,SNF)=LOC,RAP="Medicine",SAP="Health Summary",MST="HS",PCI="P" | 
|---|
| 30 | S @ARRAY@(1,0)=$$MSH(MSTR,SAP,SNF,RAP,RNF,MST,PCI,VID) | 
|---|
| 31 | S ATYPE=$S(ATYPE="F":"RD",ATYPE="C":"RD",1:"PG") | 
|---|
| 32 | S QRL=$$CONVERT("D",BDATE)_ST(2)_$$CONVERT("D",EDATE) | 
|---|
| 33 | S QFC="R",QLR=ATYPE_ST(2)_OCC,WSF=PATID,WDDC=WH | 
|---|
| 34 | S @ARRAY@(2,0)=$$QRD(WSF,WDDC,QFC,QLR,QRL) | 
|---|
| 35 | I +($G(GMTSG))'>0 D  Q:+ARRY=0 | 
|---|
| 36 | . S XMSUB="Health Summary Request",XMDUN="HEALTH SUMMARY" | 
|---|
| 37 | . S XMY("G.MC MESSAGING SERVER")="" | 
|---|
| 38 | . S XMDUZ=".5" | 
|---|
| 39 | . D ^XMD I +($G(XMZ))=0 D KILL^XM S ARRY=0 Q | 
|---|
| 40 | . S MESS1=XMZ | 
|---|
| 41 | . D KILL^XM | 
|---|
| 42 | . S ARRY=$$HL7^MCORMN(MESS1) D:+ARRY=0 REMOVE(MESS1,+ARRY) | 
|---|
| 43 | I +($G(GMTSG))>0 D  Q:$G(^TMP("MCAR1",$J,1,0))="" | 
|---|
| 44 | . D HL1^MCORMN(SAP,PATID,BDATE,EDATE,OCC,ATYPE) | 
|---|
| 45 | K ^TMP("MCAR",$J) D:+($G(GMTSG))'>0 SLIT(ARRY) | 
|---|
| 46 | ;Below the "0" input to slit is a dummy input in this case | 
|---|
| 47 | D:+($G(GMTSG))>0 SLIT(0) | 
|---|
| 48 | K ^TMP("MCAR1",$J) D:+($G(GMTSG))'>0 REMOVE(MESS1,ARRY) | 
|---|
| 49 | Q | 
|---|
| 50 | SLIT(ARRY) ; Reformat Array | 
|---|
| 51 | N LOOP,COUNT,BASE,MCOUNT,BUILDER | 
|---|
| 52 | S BUILDER=$S(+($G(GMTSG))'>0:("^XMB(3.9,"_ARRY_",2)"),1:"^TMP(""MCAR1"",$J)") | 
|---|
| 53 | S LOOP=0,(MCOUNT,COUNT)=0,SUB=1,BASE="^TMP(""MCAR"",$J)" | 
|---|
| 54 | F  S LOOP=$O(@BUILDER@(LOOP)) Q:LOOP=""  D SLITTER | 
|---|
| 55 | Q | 
|---|
| 56 | SLITTER ; This will slit the message in a usable form | 
|---|
| 57 | N VALUE,ROY,ROUT,LINE | 
|---|
| 58 | S VALUE=@BUILDER@(LOOP,0),ROY=$E(VALUE,1,3) | 
|---|
| 59 | S ROUT=$S(ROY="MSH":"SMSH",ROY="PID":"SPID",ROY="OBR":"SOBR",ROY="OBX":"SOBX",ROY="MSH":"SMSH",1:"OTHER") | 
|---|
| 60 | S LINE="D "_ROUT_"(VALUE)" | 
|---|
| 61 | X LINE | 
|---|
| 62 | Q | 
|---|
| 63 | SMSH(VALUE) ; Slit the message header | 
|---|
| 64 | N PROC,LOOP | 
|---|
| 65 | S MSTR=$E(VALUE,4,8),SUB=1 | 
|---|
| 66 | F LOOP=1:1:5 S ST(LOOP)=$E(MSTR,LOOP,LOOP) | 
|---|
| 67 | S MCOUNT=MCOUNT+1,COUNT=1 | 
|---|
| 68 | S PROC=$P($P(VALUE,ST(1),3),U,1) | 
|---|
| 69 | S @BASE@(MCOUNT,COUNT,1)="PROCEDURE"_U_U_PROC | 
|---|
| 70 | D SETREF(MCOUNT,COUNT,"PROCEDURE") | 
|---|
| 71 | Q | 
|---|
| 72 | SPID(VALUE) ; Slit the PID | 
|---|
| 73 | S SUB=1 | 
|---|
| 74 | Q | 
|---|
| 75 | SOBR(VALUE) ; Slit the OBR | 
|---|
| 76 | N TEMP,XDATE | 
|---|
| 77 | S TEMP=$$CONVERTA("D",$P(VALUE,ST(1),8)) | 
|---|
| 78 | S XDATE=TEMP,COUNT=COUNT+1,SUB=1 | 
|---|
| 79 | S @BASE@(MCOUNT,COUNT,1)="DATE/TIME"_U_U_TEMP | 
|---|
| 80 | D SETREF(MCOUNT,COUNT,"DATE/TIME") | 
|---|
| 81 | S TEMP=$$CONVERTA("P200",$P(VALUE,ST(1),33)) | 
|---|
| 82 | I TEMP'="" S COUNT=COUNT+1,@BASE@(MCOUNT,COUNT,1)="PRINCIPAL RESUILT INTERPRETER"_U_U_TEMP D SETREF(MCOUNT,COUNT,"PRINCIPAL RESULT INTERPRETER") S COUNT=COUNT+1 | 
|---|
| 83 | S TEMP=$$CONVERTA("P200",$P(VALUE,ST(1),34)) | 
|---|
| 84 | I TEMP'="" S COUNT=COUNT+1,@BASE@(MCOUNT,COUNT,1)="ASSISTANT RESUILT INTERPRETER"_U_U_TEMP  D SETREF(MCOUNT,COUNT,"ASSISTANT RESULT") S COUNT=COUNT+1 | 
|---|
| 85 | S TEMP=$$CONVERTA("P200",$P(VALUE,ST(1),35)) | 
|---|
| 86 | I TEMP'="" S COUNT=COUNT+1,@BASE@(MCOUNT,COUNT,1)="TECHNICIAN"_U_U_TEMP  D SETREF(MCOUNT,COUNT,"TECHNICIAN") S COUNT=COUNT+1 | 
|---|
| 87 | Q | 
|---|
| 88 | SOBX(VALUE) ; Slit the OBX | 
|---|
| 89 | N XDES,TEMP,FLDTYPE,UNITS,VAL | 
|---|
| 90 | S COUNT=COUNT+1 | 
|---|
| 91 | S SUB=1,TEMP=$P(VALUE,ST(1),4),XDES=$P(TEMP,ST(2),2) | 
|---|
| 92 | S TEMP=$P(TEMP,ST(2),1),FLDTYPE=$P(TEMP,ST(3),3) | 
|---|
| 93 | S:FLDTYPE=+FLDTYPE XDES=XDES_";W" | 
|---|
| 94 | S VAL=$$CONVERTA(FLDTYPE,$P(VALUE,ST(1),6)) | 
|---|
| 95 | S UNITS=$P(TEMP,ST(1),7) | 
|---|
| 96 | S @BASE@(MCOUNT,COUNT,1)=XDES_U_UNITS_U_VAL | 
|---|
| 97 | D SETREF(MCOUNT,COUNT,XDES) | 
|---|
| 98 | Q | 
|---|
| 99 | OTHER(VALUE) ; Set the next sub node if the lines continue | 
|---|
| 100 | N TEMP,UNITS | 
|---|
| 101 | S TEMP=$P(VALUE,ST(1),1),UNITS=$P(VALUE,ST(1),2),SUB=SUB+1 | 
|---|
| 102 | S @BASE@(MCOUNT,COUNT,SUB)=U_U_TEMP | 
|---|
| 103 | S:UNITS'="" $P(@BASE@(MCOUNT,COUNT,1),U,2)=UNITS | 
|---|
| 104 | Q | 
|---|
| 105 | MSH(MSTR,SAP,SNF,RAP,RNF,MST,PCI,VID) ; MSH Messaging Line | 
|---|
| 106 | N MSH,Y,%,%I | 
|---|
| 107 | S MSH="MSH"_MSTR,$P(MSH,ST(1),3)=SAP,$P(MSH,ST(1),4)=SNF | 
|---|
| 108 | D NOW^%DTC S $P(MSH,ST(1),8)=$$CONVERT("D",%) | 
|---|
| 109 | S $P(MSH,ST(1),5)=RAP,$P(MSH,ST(1),6)=RNF,$P(MSH,ST(1),9)=MST | 
|---|
| 110 | S $P(MSH,ST(1),10)=PCI,$P(MSH,ST(1),11)=VID | 
|---|
| 111 | Q MSH | 
|---|
| 112 | QRD(WSF,WDDC,QFC,QLR,QRL) ; QRD Messaging Line | 
|---|
| 113 | N QRD,Y,%,%I | 
|---|
| 114 | S QRD="QRD" | 
|---|
| 115 | D NOW^%DTC S $P(ORD,ST(1),2)=$$CONVERT("D",%) | 
|---|
| 116 | S $P(QRD,ST(1),3)=QFC,$P(QRD,ST(1),4)="I" | 
|---|
| 117 | S $P(QRD,ST(1),6)=$J,$P(QRD,ST(1),8)=QLR | 
|---|
| 118 | S $P(QRD,ST(1),9)=WSF,$P(QRD,ST(1),11)=WDDC,$P(QRD,ST(1),12)=QRL | 
|---|
| 119 | Q QRD | 
|---|
| 120 | CONVERT(FILETYPE,RST) ; Convert FileMan to HL7 | 
|---|
| 121 | N TEMP | 
|---|
| 122 | S TEMP=RST | 
|---|
| 123 | S:FILETYPE="D" TEMP=$$HLDATE^HLFNC(RST,"TS") | 
|---|
| 124 | S:FILETYPE="P" TEMP=$$HLNAME^HLFNC(RST) | 
|---|
| 125 | Q TEMP | 
|---|
| 126 | CONVERTA(FILETYPE,RST) ; Convert HL7 to FileMan | 
|---|
| 127 | N TEMP,Y | 
|---|
| 128 | S TEMP=RST | 
|---|
| 129 | I FILETYPE["D" S Y=$$FMDATE^HLFNC(RST) X ^DD("DD") S TEMP=Y | 
|---|
| 130 | S:(FILETYPE["P200")!(FILETYPE["P690") TEMP=$$FMNAME^HLFNC(RST) | 
|---|
| 131 | Q TEMP | 
|---|
| 132 | REMOVE(MESS1,MESS2) ; Remove messages from the server basket | 
|---|
| 133 | N LOOP,XMSER S MESS1=+($G(MESS1)),MESS2=+($G(MESS2)) | 
|---|
| 134 | F LOOP=MESS1,MESS2 S XMSER="S.MCHL7SERVER" S XMZ=LOOP D:LOOP'=0 REMSBMSG^XMA1C | 
|---|
| 135 | D KILL^XM | 
|---|
| 136 | Q | 
|---|
| 137 | SETREF(MCOUNT,COUNT,XDES) ; Set Count | 
|---|
| 138 | S:XDES'="" @BASE@(MCOUNT,"B",XDES,COUNT)="" | 
|---|
| 139 | Q | 
|---|