XUMF0 ;ISS/RAM - XUMF API's;04/15/02
;;8.0;KERNEL;**407,474**;Jul 10, 1995;Build 18
;Per VHA Directive 10-92-142, this routine should not be modified
;
Q
;
;
MFE(IFN,VUID,IEN,ERROR) ; -- update
;
I 'IFN S ERROR="1^Error - IFN required HLNODE: "_HLNODE Q
I IFN=4.009 S IEN=$$FIND1^DIC(IFN,,"B","GLOBAL VERSION") Q
I 'VUID S ERROR="1^Error - VUID required HLNODE: "_HLNODE Q
;
S ROOT=$$ROOT^DILFD(IFN,,1)
S IEN=$O(@ROOT@("AMASTERVUID",VUID,1,0))
;
;reactivate an existing inactive VUID
I 'IEN D
.S IEN=$O(@ROOT@("AMASTERVUID",VUID,0,0)) Q:'IEN
.K FDA,ERR
.S IENS=IEN_","
.S FDA(IFN,IENS,99.98)=1
.D FILE^DIE("E","FDA","ERR")
.I $D(ERR) D
..S ERROR="1^flag update error for IFN: "_IFN_" IEN: "_IEN_" PKV: "_PKV
..D EM^XUMF1H(ERROR,.ERR) K ERR
;
Q
;
STUB ; -- create record and update VUID with master flag
;
S XREF="B"
S NAME=$$UNESC($P(HLNODE,HLFS,3),.HL)
S ROOT=$$ROOT^DILFD(IFN,,1)
S IEN=$O(@ROOT@(XREF,NAME,0))
;
I IEN D
.N ROOT
.S ROOT=$$ROOT^DILFD(IFN,,1)
.M RECORD("BEFORE")=@ROOT@(IEN)
.S RECORD("STATUS")=$$GETSTAT^XTID(IFN,,IEN_",")
;
I 'IEN D Q:ERROR
.D CHK^DIE(IFN,.01,,NAME,.X)
.I X="^" S ERROR="1^Error - .01 is invalid"_" File #: "_IFN_" HLNODE="_HLNODE Q
.K DIC S DIC=IFN,DIC(0)="F" D FILE^DICN K DIC
.I Y="-1" S ERROR="1^Error - stub entry IFN: "_IFN_" failed HLNODE: "_HLNODE Q
.S IEN=+Y,RECORD("NEW")=1
;
S:'$G(RECORD("NEW")) ^TMP("XUMF EVENT",$J,IFN,"BEFORE",IEN,"REPLACED BY")=""
S:'$G(RECORD("NEW")) ^TMP("XUMF EVENT",$J,IFN,"BEFORE",IEN,"INHERITS FROM")=""
;
S IENS=IEN_","
;
;I $L($P(MFE,U)),$P(MFE,U)'=99.99 Q
S FDA(IFN,IENS,99.99)=VUID
S FDA(IFN,IENS,99.98)=1
;
K ERR
;
D FILE^DIE("E","FDA","ERR")
I $D(ERR) D
.S ERROR="1^VUID update error IFN: "_IFN_" IEN: "_IEN_" VUID: "_VUID_" HLNODE: "_HLNODE
.D EM^XUMF1H(ERROR,.ERR) K ERR
;
D ADD^XUMF1H
;
; clean multiple flag
K:'$D(XIEN(IEN)) XIEN
S XIEN(IEN)=$G(XIEN(IEN))+1
;
Q
;
VUID(FILE,FIELD,VUID1,X) ; -- If value type pointer and VUID may be used,
; get IEN and set it as internal value
N X1
Q:'$L(FILE)!'FIELD!'$L(VUID1) 0
D FIELD^DID(FILE,FIELD,,"POINTER","X1")
S X1=$G(X1("POINTER"))
Q:'$L(X1) 0
S X1=U_X1_"""AMASTERVUID"",X,1,0)"
S X1=$O(@X1)
Q +X1
;
VAL(FILE,FIELD,VUID1,VALUE,IENS) ; convert to internal
;
N RESULT,ERR
;
I $G(VALUE)="" Q "^"
I $G(VALUE)="""""" Q ""
;
I $L(VUID1) D Q RESULT
.S RESULT=$$VUID(FILE,FIELD,VUID,VALUE)
.I 'RESULT S RESULT="^",ERROR="1^VUID lookup failed on "_VALUE
;
D VAL^DIE(FILE,IENS,FIELD,,VALUE,.RESULT,,"ERR")
I $D(ERR)!(RESULT="^") D
.S ERROR="1^data validation error"
.D EM^XUMF1H(ERROR,.ERR)
;
Q RESULT
;
UNESC(VALUE,HL) ;Unescape value
N RESULT,ESC,ESCFS,ESCCMP,ESCSUB,ESCREP,ESCESC,ESCSEQ,CVRT
S ESC=$E(HL("ECH"),3)
S ESCFS=ESC_"F"_ESC S CVRT(ESCFS)=HL("FS")
S ESCCMP=ESC_"S"_ESC S CVRT(ESCCMP)=$E(HL("ECH"),1)
S ESCREP=ESC_"R"_ESC S CVRT(ESCREP)=$E(HL("ECH"),2)
S ESCESC=ESC_"E"_ESC S CVRT(ESCESC)=ESC
S ESCSUB=ESC_"T"_ESC S CVRT(ESCSUB)=$E(HL("ECH"),4)
F ESCSEQ=ESCFS,ESCCMP,ESCSUB,ESCREP,ESCESC D
.F Q:VALUE'[ESCSEQ D
..S VALUE=$P(VALUE,ESCSEQ,1)_CVRT(ESCSEQ)_$P(VALUE,ESCSEQ,2,9999)
Q VALUE
;
UNESCWP(TEXT,HL) ;Unescape word processing field
N ESC,NODE,NXTNODE,BNDBEG,BNDEND,CHECK,SPOT
S ESC=$E(HL("ECH"),3)
S NODE=0
F S NODE=+$O(TEXT(NODE)) Q:'NODE D
.S TEXT(NODE)=$$UNESC(TEXT(NODE),.HL)
.S BNDBEG=$E(TEXT(NODE),$L(TEXT(NODE))-1,$L(TEXT(NODE)))
.I BNDBEG[ESC D
..S NXTNODE=$O(TEXT(NODE)) Q:'NXTNODE
..S BNDEND=$E(TEXT(NXTNODE),1,2)
..Q:(BNDEND'[ESC)
..S CHECK=$$UNESC(BNDBEG_BNDEND,.HL)
..Q:($L(CHECK)=4)
..I $E(BNDBEG,1)=ESC D Q
...S TEXT(NODE)=$E(TEXT(NODE),1,$L(TEXT(NODE))-2)_$E(CHECK,1)
...S TEXT(NXTNODE)=$E(CHECK,2)_$E(TEXT(NXTNODE),3,$L(TEXT(NXTNODE)))
..S TEXT(NODE)=$E(TEXT(NODE),1,$L(TEXT(NODE))-2)_CHECK
..S TEXT(NXTNODE)=$E(TEXT(NXTNODE),3,$L(TEXT(NXTNODE)))
Q
;
EM ; -- error message
;
N X,XMTEXT,XMDUZ,GROUP,XMSUB,XMY
;
D MSG^DIALOG("AM",.X,80,,"ERR")
;
S X(.1)="HL7 message ID: "_$G(HL("MID"))
S X(.11)="",X(.12)="This message was generated by the NTRT process and MFS. No action is required on your part."
S X(.13)="This message is informational and may be used in some instances as a troubleshooting tool."
S X(.2)="",X(.3)=$G(ERROR)
S X(.4)="",X(.5)="VUID: "_$G(VUID),X(.6)=""
S:$G(XMSUB)="" XMSUB="MFS ERROR/WARNING/INFO"
S XMY("G.XUMF ERROR")="",XMDUZ=.5
S GROUP=$P($G(^DIC(4.001,+IFN,0)),U,6)
I GROUP'="" S GROUP="G."_GROUP,XMY(GROUP)=""
S XMTEXT="X("
;
M X=^TMP("XUMF ERROR",$J)
;
D ^XMD
;
Q
;
;
EVT ; -- calls the MFS event protocol
;
N OROLD,X
K DTOUT,DIROUT
;
I '$D(^TMP("XUMF EVENT")) Q
;
S X=+$O(^ORD(101,"B","XUMF MFS EVENTS",0))_";ORD(101,"
D EN^XQOR
;
K XQORPOP,X,^TMP("XUMF EVENT",$J) Q
;
Q
;
XUMF0 ;ISS/RAM - XUMF API's;04/15/02
+1 ;;8.0;KERNEL;**407,474**;Jul 10, 1995;Build 18
+2 ;Per VHA Directive 10-92-142, this routine should not be modified
+3 ;
+4 QUIT
+5 ;
+6 ;
MFE(IFN,VUID,IEN,ERROR) ; -- update
+1 ;
+2 IF 'IFN
SET ERROR="1^Error - IFN required HLNODE: "_HLNODE
QUIT
+3 IF IFN=4.009
SET IEN=$$FIND1^DIC(IFN,,"B","GLOBAL VERSION")
QUIT
+4 IF 'VUID
SET ERROR="1^Error - VUID required HLNODE: "_HLNODE
QUIT
+5 ;
+6 SET ROOT=$$ROOT^DILFD(IFN,,1)
+7 SET IEN=$ORDER(@ROOT@("AMASTERVUID",VUID,1,0))
+8 ;
+9 ;reactivate an existing inactive VUID
+10 IF 'IEN
Begin DoDot:1
+11 SET IEN=$ORDER(@ROOT@("AMASTERVUID",VUID,0,0))
IF 'IEN
QUIT
+12 KILL FDA,ERR
+13 SET IENS=IEN_","
+14 SET FDA(IFN,IENS,99.98)=1
+15 DO FILE^DIE("E","FDA","ERR")
+16 IF $DATA(ERR)
Begin DoDot:2
+17 SET ERROR="1^flag update error for IFN: "_IFN_" IEN: "_IEN_" PKV: "_PKV
+18 DO EM^XUMF1H(ERROR,.ERR)
KILL ERR
End DoDot:2
End DoDot:1
+19 ;
+20 QUIT
+21 ;
STUB ; -- create record and update VUID with master flag
+1 ;
+2 SET XREF="B"
+3 SET NAME=$$UNESC($PIECE(HLNODE,HLFS,3),.HL)
+4 SET ROOT=$$ROOT^DILFD(IFN,,1)
+5 SET IEN=$ORDER(@ROOT@(XREF,NAME,0))
+6 ;
+7 IF IEN
Begin DoDot:1
+8 NEW ROOT
+9 SET ROOT=$$ROOT^DILFD(IFN,,1)
+10 MERGE RECORD("BEFORE")=@ROOT@(IEN)
+11 SET RECORD("STATUS")=$$GETSTAT^XTID(IFN,,IEN_",")
End DoDot:1
+12 ;
+13 IF 'IEN
Begin DoDot:1
+14 DO CHK^DIE(IFN,.01,,NAME,.X)
+15 IF X="^"
SET ERROR="1^Error - .01 is invalid"_" File #: "_IFN_" HLNODE="_HLNODE
QUIT
+16 KILL DIC
SET DIC=IFN
SET DIC(0)="F"
DO FILE^DICN
KILL DIC
+17 IF Y="-1"
SET ERROR="1^Error - stub entry IFN: "_IFN_" failed HLNODE: "_HLNODE
QUIT
+18 SET IEN=+Y
SET RECORD("NEW")=1
End DoDot:1
IF ERROR
QUIT
+19 ;
+20 IF '$GET(RECORD("NEW"))
SET ^TMP("XUMF EVENT",$JOB,IFN,"BEFORE",IEN,"REPLACED BY")=""
+21 IF '$GET(RECORD("NEW"))
SET ^TMP("XUMF EVENT",$JOB,IFN,"BEFORE",IEN,"INHERITS FROM")=""
+22 ;
+23 SET IENS=IEN_","
+24 ;
+25 ;I $L($P(MFE,U)),$P(MFE,U)'=99.99 Q
+26 SET FDA(IFN,IENS,99.99)=VUID
+27 SET FDA(IFN,IENS,99.98)=1
+28 ;
+29 KILL ERR
+30 ;
+31 DO FILE^DIE("E","FDA","ERR")
+32 IF $DATA(ERR)
Begin DoDot:1
+33 SET ERROR="1^VUID update error IFN: "_IFN_" IEN: "_IEN_" VUID: "_VUID_" HLNODE: "_HLNODE
+34 DO EM^XUMF1H(ERROR,.ERR)
KILL ERR
End DoDot:1
+35 ;
+36 DO ADD^XUMF1H
+37 ;
+38 ; clean multiple flag
+39 IF '$DATA(XIEN(IEN))
KILL XIEN
+40 SET XIEN(IEN)=$GET(XIEN(IEN))+1
+41 ;
+42 QUIT
+43 ;
VUID(FILE,FIELD,VUID1,X) ; -- If value type pointer and VUID may be used,
+1 ; get IEN and set it as internal value
+2 NEW X1
+3 IF '$LENGTH(FILE)!'FIELD!'$LENGTH(VUID1)
QUIT 0
+4 DO FIELD^DID(FILE,FIELD,,"POINTER","X1")
+5 SET X1=$GET(X1("POINTER"))
+6 IF '$LENGTH(X1)
QUIT 0
+7 SET X1=U_X1_"""AMASTERVUID"",X,1,0)"
+8 SET X1=$ORDER(@X1)
+9 QUIT +X1
+10 ;
VAL(FILE,FIELD,VUID1,VALUE,IENS) ; convert to internal
+1 ;
+2 NEW RESULT,ERR
+3 ;
+4 IF $GET(VALUE)=""
QUIT "^"
+5 IF $GET(VALUE)=""""""
QUIT ""
+6 ;
+7 IF $LENGTH(VUID1)
Begin DoDot:1
+8 SET RESULT=$$VUID(FILE,FIELD,VUID,VALUE)
+9 IF 'RESULT
SET RESULT="^"
SET ERROR="1^VUID lookup failed on "_VALUE
End DoDot:1
QUIT RESULT
+10 ;
+11 DO VAL^DIE(FILE,IENS,FIELD,,VALUE,.RESULT,,"ERR")
+12 IF $DATA(ERR)!(RESULT="^")
Begin DoDot:1
+13 SET ERROR="1^data validation error"
+14 DO EM^XUMF1H(ERROR,.ERR)
End DoDot:1
+15 ;
+16 QUIT RESULT
+17 ;
UNESC(VALUE,HL) ;Unescape value
+1 NEW RESULT,ESC,ESCFS,ESCCMP,ESCSUB,ESCREP,ESCESC,ESCSEQ,CVRT
+2 SET ESC=$EXTRACT(HL("ECH"),3)
+3 SET ESCFS=ESC_"F"_ESC
SET CVRT(ESCFS)=HL("FS")
+4 SET ESCCMP=ESC_"S"_ESC
SET CVRT(ESCCMP)=$EXTRACT(HL("ECH"),1)
+5 SET ESCREP=ESC_"R"_ESC
SET CVRT(ESCREP)=$EXTRACT(HL("ECH"),2)
+6 SET ESCESC=ESC_"E"_ESC
SET CVRT(ESCESC)=ESC
+7 SET ESCSUB=ESC_"T"_ESC
SET CVRT(ESCSUB)=$EXTRACT(HL("ECH"),4)
+8 FOR ESCSEQ=ESCFS,ESCCMP,ESCSUB,ESCREP,ESCESC
Begin DoDot:1
+9 FOR
IF VALUE'[ESCSEQ
QUIT
Begin DoDot:2
+10 SET VALUE=$PIECE(VALUE,ESCSEQ,1)_CVRT(ESCSEQ)_$PIECE(VALUE,ESCSEQ,2,9999)
End DoDot:2
End DoDot:1
+11 QUIT VALUE
+12 ;
UNESCWP(TEXT,HL) ;Unescape word processing field
+1 NEW ESC,NODE,NXTNODE,BNDBEG,BNDEND,CHECK,SPOT
+2 SET ESC=$EXTRACT(HL("ECH"),3)
+3 SET NODE=0
+4 FOR
SET NODE=+$ORDER(TEXT(NODE))
IF 'NODE
QUIT
Begin DoDot:1
+5 SET TEXT(NODE)=$$UNESC(TEXT(NODE),.HL)
+6 SET BNDBEG=$EXTRACT(TEXT(NODE),$LENGTH(TEXT(NODE))-1,$LENGTH(TEXT(NODE)))
+7 IF BNDBEG[ESC
Begin DoDot:2
+8 SET NXTNODE=$ORDER(TEXT(NODE))
IF 'NXTNODE
QUIT
+9 SET BNDEND=$EXTRACT(TEXT(NXTNODE),1,2)
+10 IF (BNDEND'[ESC)
QUIT
+11 SET CHECK=$$UNESC(BNDBEG_BNDEND,.HL)
+12 IF ($LENGTH(CHECK)=4)
QUIT
+13 IF $EXTRACT(BNDBEG,1)=ESC
Begin DoDot:3
+14 SET TEXT(NODE)=$EXTRACT(TEXT(NODE),1,$LENGTH(TEXT(NODE))-2)_$EXTRACT(CHECK,1)
+15 SET TEXT(NXTNODE)=$EXTRACT(CHECK,2)_$EXTRACT(TEXT(NXTNODE),3,$LENGTH(TEXT(NXTNODE)))
End DoDot:3
QUIT
+16 SET TEXT(NODE)=$EXTRACT(TEXT(NODE),1,$LENGTH(TEXT(NODE))-2)_CHECK
+17 SET TEXT(NXTNODE)=$EXTRACT(TEXT(NXTNODE),3,$LENGTH(TEXT(NXTNODE)))
End DoDot:2
End DoDot:1
+18 QUIT
+19 ;
EM ; -- error message
+1 ;
+2 NEW X,XMTEXT,XMDUZ,GROUP,XMSUB,XMY
+3 ;
+4 DO MSG^DIALOG("AM",.X,80,,"ERR")
+5 ;
+6 SET X(.1)="HL7 message ID: "_$GET(HL("MID"))
+7 SET X(.11)=""
SET X(.12)="This message was generated by the NTRT process and MFS. No action is required on your part."
+8 SET X(.13)="This message is informational and may be used in some instances as a troubleshooting tool."
+9 SET X(.2)=""
SET X(.3)=$GET(ERROR)
+10 SET X(.4)=""
SET X(.5)="VUID: "_$GET(VUID)
SET X(.6)=""
+11 IF $GET(XMSUB)=""
SET XMSUB="MFS ERROR/WARNING/INFO"
+12 SET XMY("G.XUMF ERROR")=""
SET XMDUZ=.5
+13 SET GROUP=$PIECE($GET(^DIC(4.001,+IFN,0)),U,6)
+14 IF GROUP'=""
SET GROUP="G."_GROUP
SET XMY(GROUP)=""
+15 SET XMTEXT="X("
+16 ;
+17 MERGE X=^TMP("XUMF ERROR",$JOB)
+18 ;
+19 DO ^XMD
+20 ;
+21 QUIT
+22 ;
+23 ;
EVT ; -- calls the MFS event protocol
+1 ;
+2 NEW OROLD,X
+3 KILL DTOUT,DIROUT
+4 ;
+5 IF '$DATA(^TMP("XUMF EVENT"))
QUIT
+6 ;
+7 SET X=+$ORDER(^ORD(101,"B","XUMF MFS EVENTS",0))_";ORD(101,"
+8 DO EN^XQOR
+9 ;
+10 KILL XQORPOP,X,^TMP("XUMF EVENT",$JOB)
QUIT
+11 ;
+12 QUIT
+13 ;