XUMFXI ;ISS/RAM - MFS build message ;06/28/00
;;8.0;KERNEL;**299,382**;Jul 10, 1995
;
; This routine is the Master File Server HL7 message builder API.
; The routine will generate messages for both trigger events and
; queries.
;
; Use the routine XUMFXP to initialize the PARAM array.
; See XUMFXP for a full description of the parameters.
;
; use of $O(^HLCS(870,"C",institution_ptr)) supported by IA# 3550
;
MAIN(IFN,IEN,TYPE,PARAM,ERROR) ; -- entry point
;
;
N HLFS,HLCS,HLRESLT,QUERY,UPDATE,ALL,CNT,ROOT,PROTOCOL,MFR,MFQ,MTYP,I
N ARRAY,GROUP,MFK,CDSYS,J,HLSCS
;
M ^TMP("XUMF MFS",$J,"PARAM")=PARAM K PARAM
;
D INIT,BUILD,LLNK,SEND,EXIT
;
;
Q
;
INIT ; -- initialize
;
K ^TMP("DILIST",$J),^TMP("DIERR",$J)
K ^TMP("HLS",$J),^TMP("HLA",$J)
;
S IEN=$G(IEN),IFN=$G(IFN)
S TYPE=$G(TYPE),ERROR=$G(ERROR),CNT=1
S UPDATE=$S(TYPE#2:0,1:1)
S QUERY='UPDATE
S GROUP=$S(UPDATE:0,TYPE[5:1,TYPE[7:1,1:0)
S ARRAY=$S(UPDATE:0,TYPE[3:1,TYPE[7:1,1:0)
S ALL=$S(IEN["ALL":1,1:0)
S PROTOCOL=$G(^TMP("XUMF MFS",$J,"PARAM","PROTOCOL"))
S MFR=$S(UPDATE:0,TYPE>10:1,1:0)
S MFQ=$S(UPDATE:0,'MFR:1,1:0)
S MFK=$S(TYPE=10:1,1:0)
S MTYP=$S(MFR:"HLA",MFK:"HLA",1:"HLS")
;
; -- get variables from HL7 package
I $O(HL(""))="" D INIT^HLFNC2(PROTOCOL,.HL)
I $O(HL(""))="" S ERROR="1^"_$P(HL,"^",2) Q
S HLFS=HL("FS"),HLCS=$E(HL("ECH")),HLSCS=$E(HL("ECH"),4)
;
Q:ERROR
Q:MFK
;
; -- check parameters
I 'QUERY,'UPDATE S ERROR="1^invalid message type" Q
I 'IFN S ERROR="1^invalid file number" Q
I 'IEN,'ALL,'MFK S ERROR="1^invalid IEN" Q
I '$$VFILE^DILFD(IFN) S ERROR="1^invalid file number" Q
I UPDATE,'IEN S ERROR="1^update message requires an IEN" Q
;
; -- get root of file
S ROOT=$$ROOT^DILFD(IFN,,1)
;
; -- if IEN array input, merge with param
I 'ALL,'IEN,$O(IEN(0)) M ^TMP("XUMF MFS",$J,"PARAM","IEN")=IEN
;
; -- if CDSYS and ALL get entries
S CDSYS=$G(^TMP("XUMF MFS",$J,"PARAM","CDSYS"))
I ALL,CDSYS'="" D
.S I=0 F S I=$O(@ROOT@("XUMFIDX",CDSYS,I)) Q:'I D
..S J=$O(@ROOT@("XUMFIDX",CDSYS,I,0))
..S ^TMP("XUMF MFS",$J,"PARAM","IEN",J)=""
;
; -- get ALL file 'national' entries
I ALL,'$D(^TMP("XUMF MFS",$J,"PARAM","IEN")) D
.S I=0 F S I=$O(@ROOT@("AVUID",I)) Q:'I D
..S J=$O(@ROOT@("AVUID",I,0))
..S ^TMP("XUMF MFS",$J,"PARAM","IEN",J)=""
;
Q
;
BUILD ; -- build message
;
I MFK D MFK Q
;
Q:ERROR
;
N ID,APP,EVENT,ENDT,EFFDT,RESP,MFI,MFN,EDT,CODE,MFE
;
I QUERY D QRD Q:MFQ
;
D MFI
;
I GROUP D GROUP Q
;
D MFE,RDT
;
Q
;
MFK ; -- master file acknowledgement
;
N X,I,I1,I2
S X="MSA"_HLFS_$S(ERROR:"AE",1:"AA")_HLFS_HL("MID")_HLFS_$P(ERROR,U,2)
S ^TMP(MTYP,$J,CNT)=X
S CNT=CNT+1
;
S I1="",I=0
F S I1=$O(^TMP("XUMF ERROR",$J,I1)) Q:'$L(I1) D
.S I2="" F S I2=$O(^TMP("XUMF ERROR",$J,I1,I2)) Q:'$L(I2) D
..S X=$G(^(I2))
..Q:'$L(X)
..S I=I+1
..S X="ERR"_HLFS_I_HLFS_$S($O(^TMP("XUMF ERROR",$J,I1))!$O(^TMP("XUMF ERROR",$J,I1,I2)):1,1:0)_HLFS_X
..S ^TMP(MTYP,$J,CNT)=X
..S CNT=CNT+1
;
Q
;
QRD ; -- query definition segment
;
I TYPE>10 D
.S ^TMP(MTYP,$J,CNT)="MSA"_HLFS_$S(ERROR:"AE",1:"AA")_HLFS_HL("MID")
.S CNT=CNT+1
;
Q:ERROR
;
N QDT,QFC,QP,QID,ZDRT,ZDRDT,QLR,WHO,WHAT,WDDC,WDCVQ,QRL,QRD
;
S QDT=$G(^TMP("XUMF MFS",$J,"PARAM","QDT"))
S QFC=$G(^TMP("XUMF MFS",$J,"PARAM","QFC"))
S QP=$G(^TMP("XUMF MFS",$J,"PARAM","QP"))
S QID=$G(^TMP("XUMF MFS",$J,"PARAM","QID"))
S ZDRT=$G(^TMP("XUMF MFS",$J,"PARAM","DRT"))
S ZDRDT=$G(^TMP("XUMF MFS",$J,"PARAM","DRDT"))
S QLR=$G(^TMP("XUMF MFS",$J,"PARAM","QLR"))
S WHO=$G(^TMP("XUMF MFS",$J,"PARAM","WHO"))
S WHAT=$G(^TMP("XUMF MFS",$J,"PARAM","WHAT"))
S WDDC=$G(^TMP("XUMF MFS",$J,"PARAM","WDDC"))
S WDCVQ=$G(^TMP("XUMF MFS",$J,"PARAM","WDCVQ"))
S QRL=$G(^TMP("XUMF MFS",$J,"PARAM","QRL"))
S QRD="QRD"_HLFS_QDT_HLFS_QFC_HLFS_QP_HLFS_QID_HLFS_ZDRT_HLFS_ZDRDT
S QRD=QRD_HLFS_QLR_HLFS_WHO_HLFS_WHAT_HLFS_WDDC_HLFS_WDCVQ_HLFS_QRL
S ^TMP(MTYP,$J,CNT)=QRD
S CNT=CNT+1
;
Q
;
MFI ; master file identifier segment
;
Q:ERROR
;
N ID,APP,EVENT,ENDT,EFFDT,RESP,MFI
;
S ID=$G(^TMP("XUMF MFS",$J,"PARAM","MFI"))
S APP=$G(^TMP("XUMF MFS",$J,"PARAM","MFAI"))
S EVENT=$G(^TMP("XUMF MFS",$J,"PARAM","FLEV"))
S ENDT=$G(^TMP("XUMF MFS",$J,"PARAM","ENDT"))
S EFFDT=$G(^TMP("XUMF MFS",$J,"PARAM","MFIEDT"))
S RESP=$G(^TMP("XUMF MFS",$J,"PARAM","RLC"))
S:APP="" APP="MFS" S:EVENT="" EVENT="REP" S:RESP="" RESP="NE"
S:ENDT="" ENDT=$$NOW^XLFDT S:EFFDT="" EFFDT=$$NOW^XLFDT
S MFI=$$MFI^XUMFMFI(ID,APP,EVENT,ENDT,EFFDT,RESP)
I $E(MFI)="-" S ERROR=MFI Q
S ^TMP(MTYP,$J,CNT)=MFI
S CNT=CNT+1
;
Q
;
MFE ; master file entry segment
;
Q:ERROR
;
N EVENT,MFN,EDT,CODE,MFE
;
S EVENT=$G(^TMP("XUMF MFS",$J,"PARAM","RLEC"))
S MFN=$G(^TMP("XUMF MFS",$J,"PARAM","MFNCID"))
S EDT=$G(^TMP("XUMF MFS",$J,"PARAM","MFEEDT"))
S CODE=$G(^TMP("XUMF MFS",$J,"PARAM","PKV"))
S:EDT="" EDT=$$NOW^XLFDT S:EVENT="" EVENT="MAD"
S MFE=$$MFE^XUMFMFE(EVENT,MFN,EDT,CODE)
I $E(MFE)="-" S ERROR=MFE Q
S ^TMP(MTYP,$J,CNT)=MFE
S CNT=CNT+1
;
Q
;
RDT ; table row definition/data segment
;
Q:ERROR
;
N SEG,SEQ,ZZZ,FLD,FILE,IENS,VALUE,ERR,ZDTYP,FIELD,SEQ1,SEQ2,SEQ3
N SEQ0,SEQ9,CNT1,CNT2,NODE,XXX,LKUP
;
S SEQ=0
F S SEQ=$O(^TMP("XUMF MFS",$J,"PARAM","SEQ",SEQ)) Q:'SEQ D
.;
.S FLD=$O(^TMP("XUMF MFS",$J,"PARAM","SEQ",SEQ,0))
.;
.I 'FLD D
..S FILE=^TMP("XUMF MFS",$J,"PARAM","SEQ",SEQ,"FILE")
..S IENS=$G(^TMP("XUMF MFS",$J,"PARAM","IENS",SEQ))
..S FIELD=^TMP("XUMF MFS",$J,"PARAM","SEQ",SEQ,"FIELD")
..S ZDTYP=^TMP("XUMF MFS",$J,"PARAM","SEQ",SEQ,"DTYP")
..S LKUP=$G(^TMP("XUMF MFS",$J,"PARAM","SEQ",SEQ,"LKUP"))
..I LKUP S FIELD=FIELD_":"_LKUP
..S VALUE=$$GET1^DIQ(FILE,IENS,FIELD)
..S VALUE=$$DTYP^XUMFXP(VALUE,ZDTYP,HLCS,1)
.I FLD D
..S ZDTYP=$G(^TMP("XUMF MFS",$J,"PARAM","SEQ",SEQ,FLD))
..S LKUP=$P(ZDTYP,U,2),ZDTYP=$P(ZDTYP,U)
..I LKUP S FLD=FLD_":"_LKUP
..S VALUE=$$GET1^DIQ(IFN,IEN_",",FLD)
..S VALUE=$$DTYP^XUMFXP(VALUE,ZDTYP,HLCS,1)
.;
.S ZZZ(SEQ)=VALUE
;
K NODE
S (SEQ,SEQ0,SEQ9,SEQ1,CNT1)=0,NODE(0)=""
F S SEQ1=$O(ZZZ(SEQ1)) Q:'SEQ1 D
.S VALUE=ZZZ(SEQ1)
.I $L(NODE(CNT1)_VALUE)>200 D
..S CNT1=CNT1+1,SEQ9=SEQ0+SEQ9
.S SEQ=$S('CNT1:SEQ1,1:SEQ1-SEQ9)
.S $P(NODE(CNT1),HLFS,SEQ)=VALUE
.S SEQ0=SEQ-1
;
S NODE="RDT"_HLFS_$G(NODE(0)) K NODE(0)
;
M ^TMP(MTYP,$J,CNT)=^TMP("XUMF MFS",$J,"PARAM","RDF")
S CNT=CNT+1
M ^TMP(MTYP,$J,CNT)=NODE
S CNT=CNT+1
;
Q
;
GROUP ; -- query group records
;
Q:ERROR
;
S IEN=0
F S IEN=$O(^TMP("XUMF MFS",$J,"PARAM","IEN",IEN)) Q:'IEN D
.K ^TMP("XUMF MFS",$J,"PARAM","PKV")
.K ^TMP("XUMF MFS",$J,"PARAM","IENS")
.S ^TMP("XUMF MFS",$J,"PARAM","PKV")=^TMP("XUMF MFS",$J,"PARAM",IEN,"PKV")
.M ^TMP("XUMF MFS",$J,"PARAM","IENS")=^TMP("XUMF MFS",$J,"PARAM",IEN,"IENS")
.D MFE,RDT
;
Q
;
SEND ; -- send HL7 message
;
I 'MFK,ERROR Q
;
S HLP("PRIORITY")="I"
;
I 'TYPE D GENERATE^HLMA(PROTOCOL,"GM",1,.HLRESLT,"",.HLP)
I TYPE,(TYPE<10) D DIRECT^HLMA(PROTOCOL,"GM",1,.HLRESLT,"",.HLP)
I (TYPE>9) D GENACK^HLMA1($G(HL("EID")),$G(HLMTIENS),$G(HL("EIDS")),"GM",1,.HLRESLT)
;
; check for error
I ($P($G(HLRESLT),U,3)'="") D Q
.S ERROR=1_U_$P(HLRESLT,HLFS,3)_U_$P(HLRESLT,HLFS,2)_U_$P(HLRESLT,U)
;
; successful call, message ID returned
S ERROR="0^"_$P($G(HLRESLT),U,1)
;
Q
;
EXIT ; -- exit
;
D CLEAN^DILF
;
K ^TMP("HLS",$J),^TMP("HLA",$J)
K ^TMP("XUMF MFS",$J)
;
Q
;
LLNK ; -- dynamic addressing BROADCAST
;
Q:TYPE>9
;
I $G(^TMP("XUMF MFS",$J,"PARAM","LLNK"))'="" D Q
.S HLL("LINKS",1)=^TMP("XUMF MFS",$J,"PARAM","LLNK")
;
Q:'$$SERVER()
;
Q:TYPE
Q:'$G(^TMP("XUMF MFS",$J,"PARAM","BROADCAST"))
;
N I,J,LLNK
;
S (I,J)=0
F S I=$O(^HLCS(870,"C",I)) Q:'I D
.S J=$O(^HLCS(870,"C",I,0)) Q:'J
.S LLNK=$P($G(^HLCS(870,J,0)),U)
.S HLL("LINKS",I)="XUMF MFS^"_LLNK
;
Q
;
SERVER() ; -- servers
;
N I
;
S I=$$KSP^XUPARAM("INST") Q:'I 0
;
Q:I=662 1 ;VAB
Q:I=442 1 ;BP TEST
Q:I=12000 1 ;FORUM
Q:I=100002 1 ;HEC
;
Q 0
;
XUMFXI ;ISS/RAM - MFS build message ;06/28/00
+1 ;;8.0;KERNEL;**299,382**;Jul 10, 1995
+2 ;
+3 ; This routine is the Master File Server HL7 message builder API.
+4 ; The routine will generate messages for both trigger events and
+5 ; queries.
+6 ;
+7 ; Use the routine XUMFXP to initialize the PARAM array.
+8 ; See XUMFXP for a full description of the parameters.
+9 ;
+10 ; use of $O(^HLCS(870,"C",institution_ptr)) supported by IA# 3550
+11 ;
MAIN(IFN,IEN,TYPE,PARAM,ERROR) ; -- entry point
+1 ;
+2 ;
+3 NEW HLFS,HLCS,HLRESLT,QUERY,UPDATE,ALL,CNT,ROOT,PROTOCOL,MFR,MFQ,MTYP,I
+4 NEW ARRAY,GROUP,MFK,CDSYS,J,HLSCS
+5 ;
+6 MERGE ^TMP("XUMF MFS",$JOB,"PARAM")=PARAM
KILL PARAM
+7 ;
+8 DO INIT
DO BUILD
DO LLNK
DO SEND
DO EXIT
+9 ;
+10 ;
+11 QUIT
+12 ;
INIT ; -- initialize
+1 ;
+2 KILL ^TMP("DILIST",$JOB),^TMP("DIERR",$JOB)
+3 KILL ^TMP("HLS",$JOB),^TMP("HLA",$JOB)
+4 ;
+5 SET IEN=$GET(IEN)
SET IFN=$GET(IFN)
+6 SET TYPE=$GET(TYPE)
SET ERROR=$GET(ERROR)
SET CNT=1
+7 SET UPDATE=$SELECT(TYPE#2:0,1:1)
+8 SET QUERY='UPDATE
+9 SET GROUP=$SELECT(UPDATE:0,TYPE[5:1,TYPE[7:1,1:0)
+10 SET ARRAY=$SELECT(UPDATE:0,TYPE[3:1,TYPE[7:1,1:0)
+11 SET ALL=$SELECT(IEN["ALL":1,1:0)
+12 SET PROTOCOL=$GET(^TMP("XUMF MFS",$JOB,"PARAM","PROTOCOL"))
+13 SET MFR=$SELECT(UPDATE:0,TYPE>10:1,1:0)
+14 SET MFQ=$SELECT(UPDATE:0,'MFR:1,1:0)
+15 SET MFK=$SELECT(TYPE=10:1,1:0)
+16 SET MTYP=$SELECT(MFR:"HLA",MFK:"HLA",1:"HLS")
+17 ;
+18 ; -- get variables from HL7 package
+19 IF $ORDER(HL(""))=""
DO INIT^HLFNC2(PROTOCOL,.HL)
+20 IF $ORDER(HL(""))=""
SET ERROR="1^"_$PIECE(HL,"^",2)
QUIT
+21 SET HLFS=HL("FS")
SET HLCS=$EXTRACT(HL("ECH"))
SET HLSCS=$EXTRACT(HL("ECH"),4)
+22 ;
+23 IF ERROR
QUIT
+24 IF MFK
QUIT
+25 ;
+26 ; -- check parameters
+27 IF 'QUERY
IF 'UPDATE
SET ERROR="1^invalid message type"
QUIT
+28 IF 'IFN
SET ERROR="1^invalid file number"
QUIT
+29 IF 'IEN
IF 'ALL
IF 'MFK
SET ERROR="1^invalid IEN"
QUIT
+30 IF '$$VFILE^DILFD(IFN)
SET ERROR="1^invalid file number"
QUIT
+31 IF UPDATE
IF 'IEN
SET ERROR="1^update message requires an IEN"
QUIT
+32 ;
+33 ; -- get root of file
+34 SET ROOT=$$ROOT^DILFD(IFN,,1)
+35 ;
+36 ; -- if IEN array input, merge with param
+37 IF 'ALL
IF 'IEN
IF $ORDER(IEN(0))
MERGE ^TMP("XUMF MFS",$JOB,"PARAM","IEN")=IEN
+38 ;
+39 ; -- if CDSYS and ALL get entries
+40 SET CDSYS=$GET(^TMP("XUMF MFS",$JOB,"PARAM","CDSYS"))
+41 IF ALL
IF CDSYS'=""
Begin DoDot:1
+42 SET I=0
FOR
SET I=$ORDER(@ROOT@("XUMFIDX",CDSYS,I))
IF 'I
QUIT
Begin DoDot:2
+43 SET J=$ORDER(@ROOT@("XUMFIDX",CDSYS,I,0))
+44 SET ^TMP("XUMF MFS",$JOB,"PARAM","IEN",J)=""
End DoDot:2
End DoDot:1
+45 ;
+46 ; -- get ALL file 'national' entries
+47 IF ALL
IF '$DATA(^TMP("XUMF MFS",$JOB,"PARAM","IEN"))
Begin DoDot:1
+48 SET I=0
FOR
SET I=$ORDER(@ROOT@("AVUID",I))
IF 'I
QUIT
Begin DoDot:2
+49 SET J=$ORDER(@ROOT@("AVUID",I,0))
+50 SET ^TMP("XUMF MFS",$JOB,"PARAM","IEN",J)=""
End DoDot:2
End DoDot:1
+51 ;
+52 QUIT
+53 ;
BUILD ; -- build message
+1 ;
+2 IF MFK
DO MFK
QUIT
+3 ;
+4 IF ERROR
QUIT
+5 ;
+6 NEW ID,APP,EVENT,ENDT,EFFDT,RESP,MFI,MFN,EDT,CODE,MFE
+7 ;
+8 IF QUERY
DO QRD
IF MFQ
QUIT
+9 ;
+10 DO MFI
+11 ;
+12 IF GROUP
DO GROUP
QUIT
+13 ;
+14 DO MFE
DO RDT
+15 ;
+16 QUIT
+17 ;
MFK ; -- master file acknowledgement
+1 ;
+2 NEW X,I,I1,I2
+3 SET X="MSA"_HLFS_$SELECT(ERROR:"AE",1:"AA")_HLFS_HL("MID")_HLFS_$PIECE(ERROR,U,2)
+4 SET ^TMP(MTYP,$JOB,CNT)=X
+5 SET CNT=CNT+1
+6 ;
+7 SET I1=""
SET I=0
+8 FOR
SET I1=$ORDER(^TMP("XUMF ERROR",$JOB,I1))
IF '$LENGTH(I1)
QUIT
Begin DoDot:1
+9 SET I2=""
FOR
SET I2=$ORDER(^TMP("XUMF ERROR",$JOB,I1,I2))
IF '$LENGTH(I2)
QUIT
Begin DoDot:2
+10 SET X=$GET(^(I2))
+11 IF '$LENGTH(X)
QUIT
+12 SET I=I+1
+13 SET X="ERR"_HLFS_I_HLFS_$SELECT($ORDER(^TMP("XUMF ERROR",$JOB,I1))!$ORDER(^TMP("XUMF ERROR",$JOB,I1,I2)):1,1:0)_HLFS_X
+14 SET ^TMP(MTYP,$JOB,CNT)=X
+15 SET CNT=CNT+1
End DoDot:2
End DoDot:1
+16 ;
+17 QUIT
+18 ;
QRD ; -- query definition segment
+1 ;
+2 IF TYPE>10
Begin DoDot:1
+3 SET ^TMP(MTYP,$JOB,CNT)="MSA"_HLFS_$SELECT(ERROR:"AE",1:"AA")_HLFS_HL("MID")
+4 SET CNT=CNT+1
End DoDot:1
+5 ;
+6 IF ERROR
QUIT
+7 ;
+8 NEW QDT,QFC,QP,QID,ZDRT,ZDRDT,QLR,WHO,WHAT,WDDC,WDCVQ,QRL,QRD
+9 ;
+10 SET QDT=$GET(^TMP("XUMF MFS",$JOB,"PARAM","QDT"))
+11 SET QFC=$GET(^TMP("XUMF MFS",$JOB,"PARAM","QFC"))
+12 SET QP=$GET(^TMP("XUMF MFS",$JOB,"PARAM","QP"))
+13 SET QID=$GET(^TMP("XUMF MFS",$JOB,"PARAM","QID"))
+14 SET ZDRT=$GET(^TMP("XUMF MFS",$JOB,"PARAM","DRT"))
+15 SET ZDRDT=$GET(^TMP("XUMF MFS",$JOB,"PARAM","DRDT"))
+16 SET QLR=$GET(^TMP("XUMF MFS",$JOB,"PARAM","QLR"))
+17 SET WHO=$GET(^TMP("XUMF MFS",$JOB,"PARAM","WHO"))
+18 SET WHAT=$GET(^TMP("XUMF MFS",$JOB,"PARAM","WHAT"))
+19 SET WDDC=$GET(^TMP("XUMF MFS",$JOB,"PARAM","WDDC"))
+20 SET WDCVQ=$GET(^TMP("XUMF MFS",$JOB,"PARAM","WDCVQ"))
+21 SET QRL=$GET(^TMP("XUMF MFS",$JOB,"PARAM","QRL"))
+22 SET QRD="QRD"_HLFS_QDT_HLFS_QFC_HLFS_QP_HLFS_QID_HLFS_ZDRT_HLFS_ZDRDT
+23 SET QRD=QRD_HLFS_QLR_HLFS_WHO_HLFS_WHAT_HLFS_WDDC_HLFS_WDCVQ_HLFS_QRL
+24 SET ^TMP(MTYP,$JOB,CNT)=QRD
+25 SET CNT=CNT+1
+26 ;
+27 QUIT
+28 ;
MFI ; master file identifier segment
+1 ;
+2 IF ERROR
QUIT
+3 ;
+4 NEW ID,APP,EVENT,ENDT,EFFDT,RESP,MFI
+5 ;
+6 SET ID=$GET(^TMP("XUMF MFS",$JOB,"PARAM","MFI"))
+7 SET APP=$GET(^TMP("XUMF MFS",$JOB,"PARAM","MFAI"))
+8 SET EVENT=$GET(^TMP("XUMF MFS",$JOB,"PARAM","FLEV"))
+9 SET ENDT=$GET(^TMP("XUMF MFS",$JOB,"PARAM","ENDT"))
+10 SET EFFDT=$GET(^TMP("XUMF MFS",$JOB,"PARAM","MFIEDT"))
+11 SET RESP=$GET(^TMP("XUMF MFS",$JOB,"PARAM","RLC"))
+12 IF APP=""
SET APP="MFS"
IF EVENT=""
SET EVENT="REP"
IF RESP=""
SET RESP="NE"
+13 IF ENDT=""
SET ENDT=$$NOW^XLFDT
IF EFFDT=""
SET EFFDT=$$NOW^XLFDT
+14 SET MFI=$$MFI^XUMFMFI(ID,APP,EVENT,ENDT,EFFDT,RESP)
+15 IF $EXTRACT(MFI)="-"
SET ERROR=MFI
QUIT
+16 SET ^TMP(MTYP,$JOB,CNT)=MFI
+17 SET CNT=CNT+1
+18 ;
+19 QUIT
+20 ;
MFE ; master file entry segment
+1 ;
+2 IF ERROR
QUIT
+3 ;
+4 NEW EVENT,MFN,EDT,CODE,MFE
+5 ;
+6 SET EVENT=$GET(^TMP("XUMF MFS",$JOB,"PARAM","RLEC"))
+7 SET MFN=$GET(^TMP("XUMF MFS",$JOB,"PARAM","MFNCID"))
+8 SET EDT=$GET(^TMP("XUMF MFS",$JOB,"PARAM","MFEEDT"))
+9 SET CODE=$GET(^TMP("XUMF MFS",$JOB,"PARAM","PKV"))
+10 IF EDT=""
SET EDT=$$NOW^XLFDT
IF EVENT=""
SET EVENT="MAD"
+11 SET MFE=$$MFE^XUMFMFE(EVENT,MFN,EDT,CODE)
+12 IF $EXTRACT(MFE)="-"
SET ERROR=MFE
QUIT
+13 SET ^TMP(MTYP,$JOB,CNT)=MFE
+14 SET CNT=CNT+1
+15 ;
+16 QUIT
+17 ;
RDT ; table row definition/data segment
+1 ;
+2 IF ERROR
QUIT
+3 ;
+4 NEW SEG,SEQ,ZZZ,FLD,FILE,IENS,VALUE,ERR,ZDTYP,FIELD,SEQ1,SEQ2,SEQ3
+5 NEW SEQ0,SEQ9,CNT1,CNT2,NODE,XXX,LKUP
+6 ;
+7 SET SEQ=0
+8 FOR
SET SEQ=$ORDER(^TMP("XUMF MFS",$JOB,"PARAM","SEQ",SEQ))
IF 'SEQ
QUIT
Begin DoDot:1
+9 ;
+10 SET FLD=$ORDER(^TMP("XUMF MFS",$JOB,"PARAM","SEQ",SEQ,0))
+11 ;
+12 IF 'FLD
Begin DoDot:2
+13 SET FILE=^TMP("XUMF MFS",$JOB,"PARAM","SEQ",SEQ,"FILE")
+14 SET IENS=$GET(^TMP("XUMF MFS",$JOB,"PARAM","IENS",SEQ))
+15 SET FIELD=^TMP("XUMF MFS",$JOB,"PARAM","SEQ",SEQ,"FIELD")
+16 SET ZDTYP=^TMP("XUMF MFS",$JOB,"PARAM","SEQ",SEQ,"DTYP")
+17 SET LKUP=$GET(^TMP("XUMF MFS",$JOB,"PARAM","SEQ",SEQ,"LKUP"))
+18 IF LKUP
SET FIELD=FIELD_":"_LKUP
+19 SET VALUE=$$GET1^DIQ(FILE,IENS,FIELD)
+20 SET VALUE=$$DTYP^XUMFXP(VALUE,ZDTYP,HLCS,1)
End DoDot:2
+21 IF FLD
Begin DoDot:2
+22 SET ZDTYP=$GET(^TMP("XUMF MFS",$JOB,"PARAM","SEQ",SEQ,FLD))
+23 SET LKUP=$PIECE(ZDTYP,U,2)
SET ZDTYP=$PIECE(ZDTYP,U)
+24 IF LKUP
SET FLD=FLD_":"_LKUP
+25 SET VALUE=$$GET1^DIQ(IFN,IEN_",",FLD)
+26 SET VALUE=$$DTYP^XUMFXP(VALUE,ZDTYP,HLCS,1)
End DoDot:2
+27 ;
+28 SET ZZZ(SEQ)=VALUE
End DoDot:1
+29 ;
+30 KILL NODE
+31 SET (SEQ,SEQ0,SEQ9,SEQ1,CNT1)=0
SET NODE(0)=""
+32 FOR
SET SEQ1=$ORDER(ZZZ(SEQ1))
IF 'SEQ1
QUIT
Begin DoDot:1
+33 SET VALUE=ZZZ(SEQ1)
+34 IF $LENGTH(NODE(CNT1)_VALUE)>200
Begin DoDot:2
+35 SET CNT1=CNT1+1
SET SEQ9=SEQ0+SEQ9
End DoDot:2
+36 SET SEQ=$SELECT('CNT1:SEQ1,1:SEQ1-SEQ9)
+37 SET $PIECE(NODE(CNT1),HLFS,SEQ)=VALUE
+38 SET SEQ0=SEQ-1
End DoDot:1
+39 ;
+40 SET NODE="RDT"_HLFS_$GET(NODE(0))
KILL NODE(0)
+41 ;
+42 MERGE ^TMP(MTYP,$JOB,CNT)=^TMP("XUMF MFS",$JOB,"PARAM","RDF")
+43 SET CNT=CNT+1
+44 MERGE ^TMP(MTYP,$JOB,CNT)=NODE
+45 SET CNT=CNT+1
+46 ;
+47 QUIT
+48 ;
GROUP ; -- query group records
+1 ;
+2 IF ERROR
QUIT
+3 ;
+4 SET IEN=0
+5 FOR
SET IEN=$ORDER(^TMP("XUMF MFS",$JOB,"PARAM","IEN",IEN))
IF 'IEN
QUIT
Begin DoDot:1
+6 KILL ^TMP("XUMF MFS",$JOB,"PARAM","PKV")
+7 KILL ^TMP("XUMF MFS",$JOB,"PARAM","IENS")
+8 SET ^TMP("XUMF MFS",$JOB,"PARAM","PKV")=^TMP("XUMF MFS",$JOB,"PARAM",IEN,"PKV")
+9 MERGE ^TMP("XUMF MFS",$JOB,"PARAM","IENS")=^TMP("XUMF MFS",$JOB,"PARAM",IEN,"IENS")
+10 DO MFE
DO RDT
End DoDot:1
+11 ;
+12 QUIT
+13 ;
SEND ; -- send HL7 message
+1 ;
+2 IF 'MFK
IF ERROR
QUIT
+3 ;
+4 SET HLP("PRIORITY")="I"
+5 ;
+6 IF 'TYPE
DO GENERATE^HLMA(PROTOCOL,"GM",1,.HLRESLT,"",.HLP)
+7 IF TYPE
IF (TYPE<10)
DO DIRECT^HLMA(PROTOCOL,"GM",1,.HLRESLT,"",.HLP)
+8 IF (TYPE>9)
DO GENACK^HLMA1($GET(HL("EID")),$GET(HLMTIENS),$GET(HL("EIDS")),"GM",1,.HLRESLT)
+9 ;
+10 ; check for error
+11 IF ($PIECE($GET(HLRESLT),U,3)'="")
Begin DoDot:1
+12 SET ERROR=1_U_$PIECE(HLRESLT,HLFS,3)_U_$PIECE(HLRESLT,HLFS,2)_U_$PIECE(HLRESLT,U)
End DoDot:1
QUIT
+13 ;
+14 ; successful call, message ID returned
+15 SET ERROR="0^"_$PIECE($GET(HLRESLT),U,1)
+16 ;
+17 QUIT
+18 ;
EXIT ; -- exit
+1 ;
+2 DO CLEAN^DILF
+3 ;
+4 KILL ^TMP("HLS",$JOB),^TMP("HLA",$JOB)
+5 KILL ^TMP("XUMF MFS",$JOB)
+6 ;
+7 QUIT
+8 ;
LLNK ; -- dynamic addressing BROADCAST
+1 ;
+2 IF TYPE>9
QUIT
+3 ;
+4 IF $GET(^TMP("XUMF MFS",$JOB,"PARAM","LLNK"))'=""
Begin DoDot:1
+5 SET HLL("LINKS",1)=^TMP("XUMF MFS",$JOB,"PARAM","LLNK")
End DoDot:1
QUIT
+6 ;
+7 IF '$$SERVER()
QUIT
+8 ;
+9 IF TYPE
QUIT
+10 IF '$GET(^TMP("XUMF MFS",$JOB,"PARAM","BROADCAST"))
QUIT
+11 ;
+12 NEW I,J,LLNK
+13 ;
+14 SET (I,J)=0
+15 FOR
SET I=$ORDER(^HLCS(870,"C",I))
IF 'I
QUIT
Begin DoDot:1
+16 SET J=$ORDER(^HLCS(870,"C",I,0))
IF 'J
QUIT
+17 SET LLNK=$PIECE($GET(^HLCS(870,J,0)),U)
+18 SET HLL("LINKS",I)="XUMF MFS^"_LLNK
End DoDot:1
+19 ;
+20 QUIT
+21 ;
SERVER() ; -- servers
+1 ;
+2 NEW I
+3 ;
+4 SET I=$$KSP^XUPARAM("INST")
IF 'I
QUIT 0
+5 ;
+6 ;VAB
IF I=662
QUIT 1
+7 ;BP TEST
IF I=442
QUIT 1
+8 ;FORUM
IF I=12000
QUIT 1
+9 ;HEC
IF I=100002
QUIT 1
+10 ;
+11 QUIT 0
+12 ;