MCORMN0 ;WISC/DCB-HL7 MESSAGE BUILDER ;4/26/96 13:54
;;2.3;Medicine;;09/13/1996
W !,"This is not a valid entry point" Q
BUILD(RAP,MCDFN,SAP,SNF,RNF,MST,PCI,VID,MCLINE,MSTR,MCDEST,MCPROC,MCFILE,MCREC,SDATE,ATYPE) ; Build the message
K ^TMP("MCORMN",$J)
N MCERR,MCOR,MCOR1,MCOR2,MCOR3,MCOR4,MSE,OBR,HLECH
N LOOP,MCDS,ST,MSE,MCHOLD,MCHOLD
S MSE=0,HLECH=$E(MSTR,2,4) D SLIP(MSTR)
S MCHOLD=+$O(^MCAR(697.2,"B",MCPROC,""))
S MCHOLD=$P($G(^MCAR(697.2,MCHOLD,0)),U,8)
S MCERR=$$GETDATA^MCORMN1(MCPROC,MCREC,"^TMP(""MCORMN"",$J)",MCFILE,ATYPE) Q:MCERR=0 1
S MCHOLD=$S(MCHOLD="":MCPROC,1:MCHOLD)
D SETNODE(MCDEST,$$MSH^MCORMN01(MCHOLD,SAP,SNF,RAP,RNF,MST,PCI,VID))
D SETNODE(MCDEST,$$PID^MCORMN01(MCDFN))
D SETNODE(MCDEST,$$OBR1^MCORMN01(SDATE,MCPROC,MCREC,MCFILE)) S OBR=MCLINE
S MCOR1=""
F S MCOR1=$O(^TMP("MCORMN",$J,"E",MCOR1)) Q:MCOR1="" D
.S MCOR2=""
.F S MCOR2=$O(^TMP("MCORMN",$J,"E",MCOR1,MCOR2)) Q:MCOR2="" D
..S MCOR3=""
..F S MCOR3=$O(^TMP("MCORMN",$J,"E",MCOR1,MCOR2,MCOR3)) Q:MCOR3="" D
...D GETDATA(RAP,MCDEST,OBR,MCOR1,MCOR2,MCOR3)
I +$P($G(^MCAR(MCFILE,MCREC,2005,0)),U,4)>0 D
.N OBI,OBR,OSI,VTI,UNT,RNG
.S OBI=MCFILE_ST(3)_"2005"_ST(3)_"P"_ST(2)_"IMAGES?"_ST(2)_"DD"
.S OBR="Images are associated with this procedure"
.S OSI="",VTI="",FILETYPE="P",UNT="",RNG=""
.D SETOBX1(FILETYPE,VTI,OBI,OSI,OBR),SETOBX2(UNT,RNG)
Q 0
GETDATA(RAP,MCDEST,OBR,MCOR1,MCOR2,MCOR3) ; Process the Data
N TMP1,TMP,HL7,TYPE
S TMP=$G(^TMP("MCORMN",$J,"F",MCOR1,MCOR3,0))
S HL7=$G(^TMP("MCORMN",$J,"F",MCOR1,MCOR3,1))
S TYPE=$P(HL7,U,7)
I (TYPE'="OBR"),(TYPE'="INFO"),(RAP="Health Summary") S TYPE="DD"
Q:(TYPE="INFO")!(TYPE="MISC")!(TYPE="")
S TMP1="D "_TYPE_"(TMP,HL7,OBR,MCOR1,MCOR2,MCOR3)" X TMP1
Q
ICD9(TMP,HL7,OBX,MCOR1,MCOR2,MCOR3) ; This is the ICD9 message builder for OBX
N OID,VT1,UNT,OSI,OBI,RNG,RST,DA,DIC,DR,DIQ,XTMP,CONT
S OBI="ICD9",OSI="",MST=$G(MST)+1,OSI=MST,CONT=""
S VTI=$P(HL7,U,2) S:VTI="" VTI="CE"
S UNT="",RNG="",RST=$G(^TMP("MCORMN",$J,"E",MCOR1,MCOR2,MCOR3,1)) Q:RST=""
S DA=$O(^ICD9("B",RST,"")) Q:DA=""
S DIC="^ICD9(",DR=".01;3",DIQ="XTMP(" D EN^DIQ1
S RST=XTMP(80,DA,.01)_ST(2)_XTMP(80,DA,3)_ST(2)_"ICD9"
D SETOBX1("",VTI,OBI,OSI,RST)
Q
ASTM(TMP,HL7,OBX,MCOR1,MCOR2,MCOR3) ; This is the ASTM message builder for OBX
N ASTM,ASTME,VTI,UNT,RNG,RST,OSI,OBI,FILETYPE
S FILETYPE=$P(TMP,U,2),OSI=""
S ASTM=$P(HL7,U,1),ASTME=$G(^MCAR(690.5,ASTM,0))
S ASTM=$P(ASTME,U,1)_$P(ASTME,U,2),VTI=$P(HL7,U,2)
S OBI=ASTM_ST(2)_$P(ASTME,U,3)_ST(2)_"CPT4"
S UNT=$P(HL7,U,3),RNG=$P(HL7,U,4)
D RDATA(VTI,OBI,OSI,UNT,RNG,FILETYPE,MCOR1,MCOR2,MCOR3)
Q
SUM(TMP,HL7,OBX,MCOR1,MCOR2,MCOR3) ; This is the miss. message builder for OBX
N FILETYPE,VTI,UNT,RNG,RST,OSI,OBI
S FILETYPE=$P(TMP,U,2),OSI=""
S OBI="SST",(UNT,RNG)="",OSI=""
S VTI="TX"
D RDATA(VTI,OBI,OSI,UNT,RNG,FILETYPE,MCOR1,MCOR2,MCOR3)
Q
DD(TMP,HL7,OBX,MCOR1,MCOR2,MCOR3) ; This is the DD mesage builder for OBX
N FLDNAME,VTI,OBI,OSI,UNT,RNG,FILETYPE,FLDNAME
S FILETYPE=$P(TMP,U,2),FLDNAME=$P(TMP,"^",1),OSI=""
S VTI=$P(HL7,U,2),OBI=MCOR1_ST(3)_MCOR3_ST(3)_FILETYPE_ST(2)_FLDNAME_ST(2)_"DD"
S UNT=$P(HL7,U,3),RNG=$P(HL7,U,4)
D RDATA(VTI,OBI,OSI,UNT,RNG,FILETYPE,MCOR1,MCOR2,MCOR3)
Q
OBR(TMP,HL7,OBX,MCOR1,MCOR2,MCOR3) ; This is the OBR add on message
N RST,PIECE,FILETYPE
S FILETYPE=$P(TMP,U,2),RST=$G(^TMP("MCORMN",$J,"E",MCOR1,MCOR2,MCOR3,1))
S RST=$$CONVERT^MCORMN01(FILETYPE,RST),PIECE=$P(HL7,U,6)+1
S $P(@MCDEST@(OBX),ST(1),PIECE)=RST
Q
RDATA(VTI,OBI,OSI,UNT,RNG,FILETYPE,MCOR1,MCOR2,MCOR3) ;
N MCOR4,CONT,LEN,RSTT,TEMP,COUNT,END,RST,CNT,LOOP,LOOP2,X,DIWL,DIWR,DIWF
S MCOR4=""
F LOOP=1:1 S MCOR4=$O(^TMP("MCORMN",$J,"E",MCOR1,MCOR2,MCOR3,MCOR4)) Q:MCOR4="" D
.S X=^TMP("MCORMN",$J,"E",MCOR1,MCOR2,MCOR3,MCOR4)
.;I $L(X)>80 D WP
.I $L(X)>80 D
..D WP
.E D
..D:LOOP=1 SETOBX1(FILETYPE,VTI,OBI,OSI,X)
..D:LOOP'=1 SETNODE(MCDEST,X)
D SETOBX2(UNT,RNG)
Q
WP ;
K ^UTILITY($J,"W") S DIWL=0,DIWR=80,DIWF="" D ^DIWP
S CNT=^UTILITY($J,"W",0)
F LOOP2=1:1:CNT S RST=^UTILITY($J,"W",0,LOOP2,0) D
.I (LOOP2>1)!(LOOP>1) D SETNODE(MCDEST,RST)
.E D SETOBX1(FILETYPE,VTI,OBI,OSI,RST)
K ^UTILITY($J,"W")
Q
SETOBX1(FILETYPE,VTI,OBI,OSI,OBR) ; Sets the first part of QBX line
S:VTI="" VTI="ST"
S:OSI="" (MSE,OSI)=$G(MSE)+1
D SETNODE(MCDEST,$$OBX1^MCORMN01(FILETYPE,VTI,OBI,OSI,OBR))
Q
SETOBX2(RNG,UNT) ;Sets the second part of OBX line
S @MCDEST@(MCLINE,0)=@MCDEST@(MCLINE,0)_$$OBX2^MCORMN01(RNG,UNT)
Q
SETNODE(NODE,VALUE) ;Set the node with the HL7 message string
S MCLINE=MCLINE+1,@NODE@(MCLINE,0)=VALUE
Q
SLIP(MSTR) ;Seperate the delimiters
F LOOP=1:1:5 S ST(LOOP)=$E(MSTR,LOOP,LOOP)
Q
MCORMN0 ;WISC/DCB-HL7 MESSAGE BUILDER ;4/26/96 13:54
+1 ;;2.3;Medicine;;09/13/1996
+2 WRITE !,"This is not a valid entry point"
QUIT
BUILD(RAP,MCDFN,SAP,SNF,RNF,MST,PCI,VID,MCLINE,MSTR,MCDEST,MCPROC,MCFILE,MCREC,SDATE,ATYPE) ; Build the message
+1 KILL ^TMP("MCORMN",$JOB)
+2 NEW MCERR,MCOR,MCOR1,MCOR2,MCOR3,MCOR4,MSE,OBR,HLECH
+3 NEW LOOP,MCDS,ST,MSE,MCHOLD,MCHOLD
+4 SET MSE=0
SET HLECH=$EXTRACT(MSTR,2,4)
DO SLIP(MSTR)
+5 SET MCHOLD=+$ORDER(^MCAR(697.2,"B",MCPROC,""))
+6 SET MCHOLD=$PIECE($GET(^MCAR(697.2,MCHOLD,0)),U,8)
+7 SET MCERR=$$GETDATA^MCORMN1(MCPROC,MCREC,"^TMP(""MCORMN"",$J)",MCFILE,ATYPE)
IF MCERR=0
QUIT 1
+8 SET MCHOLD=$SELECT(MCHOLD="":MCPROC,1:MCHOLD)
+9 DO SETNODE(MCDEST,$$MSH^MCORMN01(MCHOLD,SAP,SNF,RAP,RNF,MST,PCI,VID))
+10 DO SETNODE(MCDEST,$$PID^MCORMN01(MCDFN))
+11 DO SETNODE(MCDEST,$$OBR1^MCORMN01(SDATE,MCPROC,MCREC,MCFILE))
SET OBR=MCLINE
+12 SET MCOR1=""
+13 FOR
SET MCOR1=$ORDER(^TMP("MCORMN",$JOB,"E",MCOR1))
IF MCOR1=""
QUIT
Begin DoDot:1
+14 SET MCOR2=""
+15 FOR
SET MCOR2=$ORDER(^TMP("MCORMN",$JOB,"E",MCOR1,MCOR2))
IF MCOR2=""
QUIT
Begin DoDot:2
+16 SET MCOR3=""
+17 FOR
SET MCOR3=$ORDER(^TMP("MCORMN",$JOB,"E",MCOR1,MCOR2,MCOR3))
IF MCOR3=""
QUIT
Begin DoDot:3
+18 DO GETDATA(RAP,MCDEST,OBR,MCOR1,MCOR2,MCOR3)
End DoDot:3
End DoDot:2
End DoDot:1
+19 IF +$PIECE($GET(^MCAR(MCFILE,MCREC,2005,0)),U,4)>0
Begin DoDot:1
+20 NEW OBI,OBR,OSI,VTI,UNT,RNG
+21 SET OBI=MCFILE_ST(3)_"2005"_ST(3)_"P"_ST(2)_"IMAGES?"_ST(2)_"DD"
+22 SET OBR="Images are associated with this procedure"
+23 SET OSI=""
SET VTI=""
SET FILETYPE="P"
SET UNT=""
SET RNG=""
+24 DO SETOBX1(FILETYPE,VTI,OBI,OSI,OBR)
DO SETOBX2(UNT,RNG)
End DoDot:1
+25 QUIT 0
GETDATA(RAP,MCDEST,OBR,MCOR1,MCOR2,MCOR3) ; Process the Data
+1 NEW TMP1,TMP,HL7,TYPE
+2 SET TMP=$GET(^TMP("MCORMN",$JOB,"F",MCOR1,MCOR3,0))
+3 SET HL7=$GET(^TMP("MCORMN",$JOB,"F",MCOR1,MCOR3,1))
+4 SET TYPE=$PIECE(HL7,U,7)
+5 IF (TYPE'="OBR")
IF (TYPE'="INFO")
IF (RAP="Health Summary")
SET TYPE="DD"
+6 IF (TYPE="INFO")!(TYPE="MISC")!(TYPE="")
QUIT
+7 SET TMP1="D "_TYPE_"(TMP,HL7,OBR,MCOR1,MCOR2,MCOR3)"
XECUTE TMP1
+8 QUIT
ICD9(TMP,HL7,OBX,MCOR1,MCOR2,MCOR3) ; This is the ICD9 message builder for OBX
+1 NEW OID,VT1,UNT,OSI,OBI,RNG,RST,DA,DIC,DR,DIQ,XTMP,CONT
+2 SET OBI="ICD9"
SET OSI=""
SET MST=$GET(MST)+1
SET OSI=MST
SET CONT=""
+3 SET VTI=$PIECE(HL7,U,2)
IF VTI=""
SET VTI="CE"
+4 SET UNT=""
SET RNG=""
SET RST=$GET(^TMP("MCORMN",$JOB,"E",MCOR1,MCOR2,MCOR3,1))
IF RST=""
QUIT
+5 SET DA=$ORDER(^ICD9("B",RST,""))
IF DA=""
QUIT
+6 SET DIC="^ICD9("
SET DR=".01;3"
SET DIQ="XTMP("
DO EN^DIQ1
+7 SET RST=XTMP(80,DA,.01)_ST(2)_XTMP(80,DA,3)_ST(2)_"ICD9"
+8 DO SETOBX1("",VTI,OBI,OSI,RST)
+9 QUIT
ASTM(TMP,HL7,OBX,MCOR1,MCOR2,MCOR3) ; This is the ASTM message builder for OBX
+1 NEW ASTM,ASTME,VTI,UNT,RNG,RST,OSI,OBI,FILETYPE
+2 SET FILETYPE=$PIECE(TMP,U,2)
SET OSI=""
+3 SET ASTM=$PIECE(HL7,U,1)
SET ASTME=$GET(^MCAR(690.5,ASTM,0))
+4 SET ASTM=$PIECE(ASTME,U,1)_$PIECE(ASTME,U,2)
SET VTI=$PIECE(HL7,U,2)
+5 SET OBI=ASTM_ST(2)_$PIECE(ASTME,U,3)_ST(2)_"CPT4"
+6 SET UNT=$PIECE(HL7,U,3)
SET RNG=$PIECE(HL7,U,4)
+7 DO RDATA(VTI,OBI,OSI,UNT,RNG,FILETYPE,MCOR1,MCOR2,MCOR3)
+8 QUIT
SUM(TMP,HL7,OBX,MCOR1,MCOR2,MCOR3) ; This is the miss. message builder for OBX
+1 NEW FILETYPE,VTI,UNT,RNG,RST,OSI,OBI
+2 SET FILETYPE=$PIECE(TMP,U,2)
SET OSI=""
+3 SET OBI="SST"
SET (UNT,RNG)=""
SET OSI=""
+4 SET VTI="TX"
+5 DO RDATA(VTI,OBI,OSI,UNT,RNG,FILETYPE,MCOR1,MCOR2,MCOR3)
+6 QUIT
DD(TMP,HL7,OBX,MCOR1,MCOR2,MCOR3) ; This is the DD mesage builder for OBX
+1 NEW FLDNAME,VTI,OBI,OSI,UNT,RNG,FILETYPE,FLDNAME
+2 SET FILETYPE=$PIECE(TMP,U,2)
SET FLDNAME=$PIECE(TMP,"^",1)
SET OSI=""
+3 SET VTI=$PIECE(HL7,U,2)
SET OBI=MCOR1_ST(3)_MCOR3_ST(3)_FILETYPE_ST(2)_FLDNAME_ST(2)_"DD"
+4 SET UNT=$PIECE(HL7,U,3)
SET RNG=$PIECE(HL7,U,4)
+5 DO RDATA(VTI,OBI,OSI,UNT,RNG,FILETYPE,MCOR1,MCOR2,MCOR3)
+6 QUIT
OBR(TMP,HL7,OBX,MCOR1,MCOR2,MCOR3) ; This is the OBR add on message
+1 NEW RST,PIECE,FILETYPE
+2 SET FILETYPE=$PIECE(TMP,U,2)
SET RST=$GET(^TMP("MCORMN",$JOB,"E",MCOR1,MCOR2,MCOR3,1))
+3 SET RST=$$CONVERT^MCORMN01(FILETYPE,RST)
SET PIECE=$PIECE(HL7,U,6)+1
+4 SET $PIECE(@MCDEST@(OBX),ST(1),PIECE)=RST
+5 QUIT
RDATA(VTI,OBI,OSI,UNT,RNG,FILETYPE,MCOR1,MCOR2,MCOR3) ;
+1 NEW MCOR4,CONT,LEN,RSTT,TEMP,COUNT,END,RST,CNT,LOOP,LOOP2,X,DIWL,DIWR,DIWF
+2 SET MCOR4=""
+3 FOR LOOP=1:1
SET MCOR4=$ORDER(^TMP("MCORMN",$JOB,"E",MCOR1,MCOR2,MCOR3,MCOR4))
IF MCOR4=""
QUIT
Begin DoDot:1
+4 SET X=^TMP("MCORMN",$JOB,"E",MCOR1,MCOR2,MCOR3,MCOR4)
+5 ;I $L(X)>80 D WP
+6 IF $LENGTH(X)>80
Begin DoDot:2
+7 DO WP
End DoDot:2
+8 IF '$TEST
Begin DoDot:2
+9 IF LOOP=1
DO SETOBX1(FILETYPE,VTI,OBI,OSI,X)
+10 IF LOOP'=1
DO SETNODE(MCDEST,X)
End DoDot:2
End DoDot:1
+11 DO SETOBX2(UNT,RNG)
+12 QUIT
WP ;
+1 KILL ^UTILITY($JOB,"W")
SET DIWL=0
SET DIWR=80
SET DIWF=""
DO ^DIWP
+2 SET CNT=^UTILITY($JOB,"W",0)
+3 FOR LOOP2=1:1:CNT
SET RST=^UTILITY($JOB,"W",0,LOOP2,0)
Begin DoDot:1
+4 IF (LOOP2>1)!(LOOP>1)
DO SETNODE(MCDEST,RST)
+5 IF '$TEST
DO SETOBX1(FILETYPE,VTI,OBI,OSI,RST)
End DoDot:1
+6 KILL ^UTILITY($JOB,"W")
+7 QUIT
SETOBX1(FILETYPE,VTI,OBI,OSI,OBR) ; Sets the first part of QBX line
+1 IF VTI=""
SET VTI="ST"
+2 IF OSI=""
SET (MSE,OSI)=$GET(MSE)+1
+3 DO SETNODE(MCDEST,$$OBX1^MCORMN01(FILETYPE,VTI,OBI,OSI,OBR))
+4 QUIT
SETOBX2(RNG,UNT) ;Sets the second part of OBX line
+1 SET @MCDEST@(MCLINE,0)=@MCDEST@(MCLINE,0)_$$OBX2^MCORMN01(RNG,UNT)
+2 QUIT
SETNODE(NODE,VALUE) ;Set the node with the HL7 message string
+1 SET MCLINE=MCLINE+1
SET @NODE@(MCLINE,0)=VALUE
+2 QUIT
SLIP(MSTR) ;Seperate the delimiters
+1 FOR LOOP=1:1:5
SET ST(LOOP)=$EXTRACT(MSTR,LOOP,LOOP)
+2 QUIT