VistA-FOIAVistA/r/KERNEL-XU-A4A7-USC-XG-XLF-X.../XUMF1H.m

408 lines
8.7 KiB
Mathematica

XUMF1H ;ISS/RAM - MFS Handler ;6/27/06 07:50
;;8.0;KERNEL;**407**;Jul 10, 1995;Build 8
;
; This routine handles Master File HL7 messages.
;
MAIN ; -- entry point
;
N CNT,ERR,I,X,HLFS,HLCS,ERROR,HLRESLTA,IFN,IEN,MTPE,TYPE,ARRAY
N HDT,KEY,MID,REASON,VALUE,XREF,ALL,GROUP,PARAM,ROOT,SEG,QRD,XUMF
N QID,WHAT,WHO,HLSCS,CDSYS,EXIT,HLREP,NUMBER,Y,XXX,YYY,XIEN
N XUMFSDS,FDA,LIST,ERRCNT,PKV,MKEY,MKEY1,TYP,MFI,IMPLY
;
D INIT,PROCESS,REPLY,EXIT
;
Q
;
INIT ; -- initialize
;
K ^TMP("DILIST",$J),^TMP("DIERR",$J)
K ^TMP("HLS",$J),^TMP("HLA",$J)
K ^TMP("XUMF MFS",$J),^TMP("XUMF ERROR",$J)
;
S XUMF=1,DUZ(0)="@"
;
S (ERROR,CNT,TYPE,ARRAY,EXIT,ERRCNT)=0
S HLFS=HL("FS"),HLCS=$E(HL("ECH"))
S HLSCS=$E(HL("ECH"),4),HLREP=$E(HL("ECH"),2)
;
Q
;
PROCESS ; -- pull message text
;
F X HLNEXT Q:HLQUIT'>0 D
.Q:$P(HLNODE,HLFS)=""
.Q:"^MSH^MSA^QRD^MFI^MFE^ZRT^"'[(U_$P(HLNODE,HLFS)_U)
.D @($P(HLNODE,HLFS))
I $D(LIST) D LIST
I $D(FDA) D UPDATE
I $D(IFN) D POST
;
Q
;
MSH ; -- MSH segment
;
Q
;
MSA ; -- MSA segment
;
N CODE
;
S CODE=$P(HLNODE,HLFS,2)
;
I CODE="AE"!(CODE="AR") D
.S ERROR=ERROR_U_$P(HLNODE,HLFS,4)_U_$G(ERR)
.D EM^XUMFX(ERROR,.ERR)
;
Q
;
MFI ; -- MFI segment
;
Q:ERROR
Q:EXIT
;
Q
;
MFE ; -- MFE SEGMENT
;
Q:ERROR
Q:EXIT
;
S PKV=$P(HLNODE,HLFS,5),MFI=$P(PKV,"@")
;
I $D(LIST) D LIST K LIST,LISTVUID
I $D(FDA) D UPDATE K FDA
I $D(IFN),(IFN'=$O(^DIC(4.001,"MFID",MFI,0))) D POST
;
K IFN,IEN,PRE,POST,VUID,IMPLY
K ^TMP("XUMF IMPLIED LOGIC",$J)
;
I MFI="" S ERROR="1^MFI not resolved HLNODE: "_HLNODE Q
S IFN=$O(^DIC(4.001,"MFID",MFI,0))
I 'IFN S ERROR="1^IFN not resolved HLNODE: "_HLNODE Q
;
S VUID=$P($P(PKV,"@",2),HLCS)
;
Q:ARRAY
;
D MFE^XUMF0(IFN,VUID,.IEN,.ERROR) Q:ERROR
;
D MFE0
;
;Implied logic flag - must be set by MFE-Processing Logic field (#4)
S IMPLY=+$G(^TMP("XUMF IMPLIED LOGIC",$J))
S IMPLY("KILL")=0
K ^TMP("XUMF IMPLIED LOGIC",$J)
;
I IEN D
.; clean multiple flag
.K:'$D(XIEN(IFN,IEN)) XIEN
.S XIEN(IFN,IEN)=$G(XIEN(IFN,IEN))+1
;
Q
;
ZRT ; -- data segments
;
Q:ERROR
Q:EXIT
;
I $G(ARRAY) D ARRAY Q
;
N COL,X,Y,Z,DTYP,IDX,SEQ,DATA,NAME,VUID1,LIST1
N FIELD,SUBFILE,LKUP,REPEAT,CLEAN,TIMEZONE,WP
;
S NAME=$P(HLNODE,HLFS,2)
;
I 'IEN,NAME="Term" D STUB^XUMF0 Q
I 'IEN S ERROR="1^IEN not defined IFN: "_IFN_" VUID: "_VUID Q
;
D ZRT0 Q:ERROR
;
S IENS=IEN_","
;
S IDX=$O(^DIC(4.001,+IFN,1,"B",NAME,0))
I 'IDX S ERROR="1^parameter "_NAME_" not defined IFN: "_IFN Q
S DATA=$G(^DIC(4.001,+IFN,1,+IDX,0))
S TYP=$P(DATA,U,3),TYP=$$GET1^DIQ(771.4,(+TYP_","),.01)
S FIELD=$P(DATA,U,2),SUBFILE=$P(DATA,U,4),MKEY=$P(DATA,U,6)
S LKUP=$P(DATA,U,7),TIMEZONE=$P(DATA,U,14),LIST1=$P(DATA,U,8)
S REPEAT=$P(DATA,U,11),CLEAN=$P(DATA,U,12),VUID1=$P(DATA,U,13)
S WP=$P(DATA,U,16)
;
I WP D WP Q
;
S VALUE=$$UNESC^XUMF0($P(HLNODE,HLFS,3),.HL)
S VALUE=$$DTYP^XUMFXP(VALUE,TYP,HLCS,0,TIMEZONE)
;
I NAME="Status" D STATUS Q
;
I 'SUBFILE D Q
.S VALUE=$$VAL^XUMF0(IFN,FIELD,VUID1,VALUE,IENS) Q:VALUE="^"
.S FDA(IFN,IENS,FIELD)=VALUE
;
N IENS1
;
I LIST1 D Q
.S VALUE=$$VAL^XUMF0(SUBFILE,FIELD,VUID1,VALUE,"?+1,"_IENS) Q:VALUE="^"
.I MKEY=NAME S ZKEY=VALUE ;S:VUID1'="" LISTVUID(SUBFILE)=1
.I '$D(ZKEY) S ERROR="1^ZKEY error "_SUBFILE_" VUID: "_VUID Q
.I ((ZKEY="")!(ZKEY=$C(34,34))) S LIST(SUBFILE)="" Q
.S LIST(SUBFILE,ZKEY,FIELD)=VALUE
.I IMPLY D IMPLY
;
I CLEAN,$G(XIEN(IFN,IEN))'>1 D
.N ROOT,IDX
.S ROOT=$$ROOT^DILFD(SUBFILE,","_IENS,1)
.S IDX=0 F S IDX=$O(@ROOT@(IDX)) Q:'IDX D
..D
...N DA,DIK,DIC S DA(1)=+IENS,DA=IDX,DIK=$P(ROOT,")")_"," D ^DIK
;
I MKEY=NAME Q:VALUE="" D
.N FDA,IEN
.
.S VALUE=$$VAL^XUMF0(SUBFILE,FIELD,VUID1,VALUE,"?+1,"_IENS) Q:VALUE="^"
.S FDA(SUBFILE,"?+1,"_IENS,.01)=VALUE
.D UPDATE^DIE(,"FDA","IEN","ERR")
.I $D(ERR) D Q
..S ERROR="1^subfile update error SUBFILE#: "_SUBFILE
..D EM(ERROR,.ERR) K ERR
.S IENS1=IEN(1)_","_IENS,MKEY(NAME)=IENS1
;
I MKEY'="",MKEY'=NAME S IENS1=$G(MKEY(MKEY)) Q:IENS1=""
S:MKEY'=NAME VALUE=$$VAL^XUMF0(SUBFILE,FIELD,VUID1,VALUE,"?+1,"_IENS) Q:VALUE="^"
S:$D(IENS1) FDA(SUBFILE,IENS1,FIELD)=VALUE
I IMPLY D IMPLY
;
Q
;
IMPLY ; -- Implied value logic
N PREV,ARR
S ARR=$S(LIST1:"LIST",1:"FDA")
S PREV=$S(LIST1:ZKEY,1:IENS1)
I MKEY=NAME D Q
.I IMPLY("KILL") K IMPLY("PREV") S IMPLY("KILL")=0
.S IMPLY("PREV",PREV)=""
S PREV="" F S PREV=$O(IMPLY("PREV",PREV)) Q:PREV="" D
.S @ARR@(SUBFILE,PREV,FIELD)=VALUE
S IMPLY("KILL")=1
Q
;
LIST ; -- process list
;
N SUBFILE,ZKEY,FIELD,VALUE,IENS,CNT
;
S IENS=IEN_","
;
;remove non-standard sub-records (not in message)
S SUBFILE=0
F S SUBFILE=$O(LIST(SUBFILE)) Q:'SUBFILE D
.N ROOT,IDX
.S ROOT=$$ROOT^DILFD(SUBFILE,","_IENS,1)
.S IDX=0 F S IDX=$O(@ROOT@(IDX)) Q:'IDX D
..S VALUE=$$GET1^DIQ(SUBFILE,IDX_","_IENS,.01,"I")
..I '$D(LIST(SUBFILE,VALUE)) D
...N DA,DIK,DIC S DA(1)=+IENS,DA=IDX,DIK=$P(ROOT,")")_"," D ^DIK
;
;update sub-records
S SUBFILE=0
F S SUBFILE=$O(LIST(SUBFILE)) Q:'SUBFILE D
.S ZKEY="",CNT=0
.F S ZKEY=$O(LIST(SUBFILE,ZKEY)) Q:ZKEY="" D
..N IDX,ROOT
..S ROOT=$$ROOT^DILFD(SUBFILE,","_IENS,1)
..S IDX=$O(@ROOT@("B",ZKEY,0))
..I $O(@ROOT@("B",ZKEY,IDX)) D DELLIST(IDX)
..I 'IDX D ADDLIST Q
..S FIELD=0
..F S FIELD=$O(LIST(SUBFILE,ZKEY,FIELD)) Q:'FIELD D
...N X S X=$$GET1^DIQ(SUBFILE,IDX_","_IENS,FIELD)
...S VALUE=LIST(SUBFILE,ZKEY,FIELD)
...Q:VALUE=X Q:(VALUE=""""&X="")
...S FDA(SUBFILE,IDX_","_IENS,FIELD)=VALUE
;
Q
;
ADDLIST ; -- add new sub-record
;
N FDA
;
S CNT=$G(CNT)+1
S FIELD=0
F S FIELD=$O(LIST(SUBFILE,ZKEY,FIELD)) Q:'FIELD D
.S VALUE=LIST(SUBFILE,ZKEY,FIELD) Q:VALUE=""
.S FDA(SUBFILE,"+"_CNT_","_IENS,FIELD)=VALUE
;
Q:'$D(FDA)
;
D UPDATE^DIE(,"FDA",,"ERR")
I $D(ERR) D Q
.S ERROR="1^subfile update error SUBFILE#: "_SUBFILE
.D EM(ERROR,.ERR) K ERR
;
Q
;
DELLIST(IDX) ; -- delete duplicate
;
F S IDX=$O(@ROOT@("B",ZKEY,IDX)) Q:'IDX D
.N DA,DIK,DIC S DA(1)=+IENS,DA=IDX,DIK=$P(ROOT,")")_"," D ^DIK
;
Q
;
UPDATE ; -- FileMan update
;
Q:ERROR
Q:EXIT
;
D:$D(FDA) FILE^DIE(,"FDA","ERR")
I $D(ERR) D
.S ERROR="1^updating error"
.D EM(ERROR,.ERR) K ERR
;
Q
;
ARRAY ; -- query data stored in array (not filed)
;
S ^TMP("XUMF ARRAY",$J,IFN,VUID,$P(HLNODE,HLFS,2))=$P(HLNODE,HLFS,3)
;
Q
;
ADD ; -- ADD-processing logic
;
N X
;
S X=$G(^DIC(4.001,+IFN,3)) X:X'="" X
;
Q
;
MFE0 ; -- MFE-processing logic
;
N X
;
S X=$G(^DIC(4.001,+IFN,4)) X:X'="" X
;
Q
;
ZRT0 ; -- ZRT-processing logic
;
N X
;
S X=$G(^DIC(4.001,+IFN,5)) X:X'="" X
;
Q
;
POST ; -- post-processing logic
;
N X
;
S X=$G(^DIC(4.001,+IFN,2)) X:X'="" X
;
Q
;
EXIT ; -- cleanup, and quit
;
K ^TMP("DILIST",$J),^TMP("DIERR",$J),^TMP("HLS",$J),^TMP("HLA",$J)
;
K ^TMP("XUMF MFS",$J),^TMP("XUMF ERROR",$J)
;
Q
;
REPLY ; -- MFK
;
N X,I,I1,I2,CNT
;
S CNT=1
S X="MSA"_HLFS_$S(ERROR:"AE",1:"AA")_HLFS_HL("MID")_HLFS_$P(ERROR,U,2)
S ^TMP("HLA",$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("HLA",$J,CNT)=X
..S CNT=CNT+1
;
D:ERROR EM^XUMF0
;
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
;
EM(ERROR,ERR) ; -- error message
;
N X,I,Y
;
D MSG^DIALOG("AM",.X,80,,"ERR")
;
S ERRCNT=ERRCNT+1
;
S ^TMP("XUMF ERROR",$J,ERRCNT_".01")=""
S ^TMP("XUMF ERROR",$J,ERRCNT_".02")=""
S ^TMP("XUMF ERROR",$J,ERRCNT_".03")=$G(ERROR)
S ^TMP("XUMF ERROR",$J,ERRCNT_".04")=""
S ^TMP("XUMF ERROR",$J,ERRCNT_".05")="VUID: "_$G(VUID)_" IFN: "_$G(IFN)_" IEN: "_IEN
S ^TMP("XUMF ERROR",$J,ERRCNT_".06")=""
S X=.9 F S X=$O(X(X)) Q:'X D
.S ^TMP("XUMF ERROR",$J,ERRCNT_"."_X)=X(X)
;
Q
;
STATUS ;
;
I VALUE=$P($$GETSTAT^XTID(IFN,,IEN_","),U) Q
;
I SUBFILE="" S ERROR="1^status parameter error" Q
;
N FDA
S FDA(SUBFILE,"?+1,"_IENS,.01)=$$NOW^XLFDT
S FDA(SUBFILE,"?+1,"_IENS,.02)=VALUE
D UPDATE^DIE(,"FDA",,"ERR")
I $D(ERR) D
.S ERROR="1^effective date and status error"
.D EM(ERROR,.ERR) K ERR
;
Q
;
WP ;
;
N X,Y,A,I,CNT,X1,X2,ESC
D SEGPRSE^XUMFXHL7("HLNODE","X",HLFS,60)
;
S CNT=1
S A(CNT)=X(2)
S I=0
F S I=$O(X(2,I)) Q:'I D
.S Y=X(2,I)
.I $E(Y,1)=" " D Q
..S A(CNT)=A(CNT)_" "
..Q:$P(Y," ",2)=""
..S CNT=CNT+1
..S A(CNT)=$P(Y," ",2,99)
.S X1=$P(Y," ",1)
.S X2=$P(Y," ",2,99)
.S A(CNT)=A(CNT)_X1_$S(X2="":"",1:" ")
.Q:X2=""
.S CNT=CNT+1
.S A(CNT)=X2
;
D UNESCWP^XUMF0(.A,.HL)
;
D WP^DIE(IFN,IENS,FIELD,"K","A","ERR")
;
I $D(ERR) D
.S ERROR="1^wp field error"
.D EM(ERROR,.ERR) K ERR
;
Q
;