HLCHK ;AISC/SAW-Validate HL7 Messages Received ;3/24/2004  14:09
 ;;1.6;HEALTH LEVEL SEVEN;**1,108**;Oct 13, 1995
 ;This routine is used for the Version 1.5 Interface Only
 D CHK D IN^HLTF(HLMTN,HLMID,HLTIME) S HLMT=$S(HLMTN="QRY":"ORF",HLMTN="ORM":"ORR",1:"ACK") D MSH G ACK:$D(HLERR)
 K HLDATA,HLL,HLMSA,HLMT,HLMTP,^TMP("HLR",$J) I HLROU="^NONE"!(HLROU="^") D KILL Q
 D @HLROU G REPLY
MSH ;Create MSH Segment for HL7 Reply
 I '$D(HLDT)!('$D(HLDT1)) N %,%H,%I D NOW^%DTC S HLDT=%,HLDT1=$$HLDATE^HLFNC(HLDT)
 S HLSDATA(1)="MSH"_HLFS_HLECH_HLFS_$P(HLDATA,HLFS,5,6)_HLFS_$P(HLDATA,HLFS,3,4)_HLFS_HLDT1_HLFS_HLFS_HLMT_HLFS_HLDT_HLFS_HLPID_HLFS_HLVER Q
CHK ;Validate Data in Header Segment of an HL7 Message
 K HLERR S HLDATA=HLL(1),HLFS=$E(HLDATA,4),HLECH=$P(HLDATA,HLFS,2),HLQ="""""",HLDAN=$P(HLDATA,HLFS,5),HLMNT="" D
 .I $E(HLDATA,1,3)="BHS" S HLMID=$P(HLDATA,HLFS,11),X=$P(HLDATA,HLFS,9),HLPID=$P(X,$E(HLECH),2),HLMTN=$E($P(X,$E(HLECH),3),1,3),HLVER=$P(X,$E(HLECH),4) S:$P(HLDATA,HLFS,10)]"" HLMSA=$P(HLDATA,HLFS,10),$P(HLMSA,$E(HLECH),2)=$P(HLDATA,HLFS,12)
 .I $E(HLDATA,1,3)="MSH" S HLMID=$P(HLDATA,HLFS,10),HLPID=$P(HLDATA,HLFS,11),HLMTN=$P($P(HLDATA,HLFS,9),$E(HLECH)),HLVER=$P(HLDATA,HLFS,12) S:HLMTN="" HLMTN=0 I $E($G(HLL(2)),1,3)="MSA" S HLMSA=HLL(2)
 I HLMTN']"" S HLERR="Invalid Message Type" Q
 I '$D(^HL(771.2,"B",HLMTN)) S HLERR="Invalid Message Type" Q
 I HLFS=""!(HLFS?.C) S HLERR="Invalid Header Segment" Q
 I $E(HLDATA,1,3)'="MSH",$E(HLDATA,1,3)'="BHS" S HLERR="Invalid Header Segment" Q
 I HLDAN']"" S HLERR="Invalid Receiving Application" Q
 ; patch HL*1.6*108 start
 ;S HLDAP=+$O(^HL(771,"B",HLDAN,0)) I 'HLDAP S HLDAN=$$UPPER^HLFNC(HLDAN),HLDAP=+$O(^HL(771,"B",HLDAN,0))
 S HLDAP=+$O(^HL(771,"B",$E(HLDAN,1,30),0)) I 'HLDAP S HLDAN=$$UPPER^HLFNC(HLDAN),HLDAP=+$O(^HL(771,"B",$E(HLDAN,1,30),0))
 ; patch HL*!.6*108 end
 ;
 I 'HLDAP S HLERR="Invalid Receiving Application" Q
 I '$D(^HL(771,HLDAP,0)) S HLERR="Invalid Receiving Application" Q
 I $P(^HL(771,HLDAP,0),"^",2)'="a" S HLERR="Receiving Application is Inactive" Q
 S X=$P(HLDATA,HLFS,3) I X']"" S HLERR="Invalid Sending Application" Q
 I '$D(^HL(770,"AF",X)) S X=$$UPPER^HLFNC(X)
 I '$D(^HL(770,"AF",X)) S HLERR="Invalid Sending Application" Q
 S HLSA=X,X=$P(HLDATA,HLFS,4) I X']"" S HLERR="Invalid Sending Facility" Q
 I '$D(^HL(770,"AF",HLSA,X)) S X=$$UPPER^HLFNC(X)
 I '$D(^HL(770,"AF",HLSA,X)) S HLERR="Invalid Sending Facility" Q
 S X=$P(HLDATA,HLFS,6),X=$$UPPER^HLFNC(X) I X']"" S HLERR="Invalid Receiving Facility" Q
 I '$D(^HL(770,"AE",HLSA,X)) S HLERR="Invalid Receiving Facility" Q
 I '$D(HLNDAP0) S HLNDAP=+$O(^HL(770,"B",HLSA,0)),HLNDAP0=$G(^HL(770,HLNDAP,0)) S:$P(HLNDAP0,"^",6)]"" HLION=$P(HLNDAP0,"^",6)
 I HLVER']"" S HLERR="Invalid HL7 Version" Q
 S X=$O(^HL(771.5,"B",HLVER,0)) I 'X S HLERR="Invalid HL7 Version" Q
 I X'=$P(^HL(770,+$O(^HL(770,"B",HLSA,0)),0),"^",7) S HLERR="Invalid HL7 version for Receiving Application" Q
 I "DTP"'[HLPID S HLERR="Inappropriate HL7 Processing ID" Q
 S HLMTP=+$O(^HL(771.2,"B",HLMTN,0)) I HLMTN'="ACK",'$O(^HL(771,HLDAP,"MSG","B",HLMTP,0)) S HLERR="Invalid Message Type for Receiving Application" Q
 S HLROU=$G(^HL(771,HLDAP,"MSG",+$O(^HL(771,HLDAP,"MSG","B",HLMTP,0)),"R")) I HLROU']""!(HLROU="NONE") I HLMTN'="ACK",HLMTN'="MCF" S HLERR="Invalid Message Type for Receiving Application" Q
 S X=$P($P(HLDATA,HLFS,8),$E(HLECH)),X=$$UPPER^HLFNC(X) D ^XUSHSH D  Q:$D(HLERR)
 .I X']"" S:HLMTN'="ACK"&(HLMTN'="MCF")&(HLMTN'="ORR") HLDUZ=0 Q
 .S HLDUZ=+$O(^VA(200,"A",X,0)) I '$D(^VA(200,HLDUZ,.1)) I HLMTN'="ACK",HLMTN'="MCF",HLMTN'="ORR" S HLDUZ=0
 S X=$P($P(HLDATA,HLFS,8),$E(HLECH),3) I X]"" D  Q:$D(HLERR)
 .I '$D(^VA(200,HLDUZ,20)) S HLERR="No Signature Code on File" Q
 .S X=$$UPPER^HLFNC(X) D HASH^XUSHSHP I X'=$P(^VA(200,HLDUZ,20),"^",4)!($P(^(20),"^",2)']"") S HLERR="Invalid Electronic Signature Code" Q
 .S HLESIG=$P(^VA(200,HLDUZ,20),"^",2)
 S:HLROU'["^" HLROU="^"_HLROU Q
ACK ;Create and Send 'AR' Error Type Acknowledgement Message
 K HLDATA,HLL,^TMP("HLR",$J) S HLSDATA(2)="MSA"_HLFS_"AR"_HLFS_HLMID_HLFS_HLERR
 K HLERR D SEND^HLLP,KILL
 Q
 ;
REPLY ;Send a Reply/Ack to a HL7 Message Received
 N I,HLAC,HLMSG,HLERR
 I $D(HLSDT) S I="",I=$O(^TMP("HLS",$J,HLSDT,I)),I=$O(^(I)),HLMSA=$G(^(+I))
 I '$D(HLSDT),$D(HLSDATA) S I="",I=$O(HLSDATA(I)),I=$O(HLSDATA(I)),HLMSA=$G(HLSDATA(+I))
 I $D(HLMSA),$D(HLDAP),HLDAP,$E(HLMSA,1,3)="MSA" S HLMSG="" D
 . S HLAC=$P(HLMSA,HLFS,2)
 . Q:(HLAC="")!('$D(HLNDAP))
 . I $P(HLMSA,HLFS,4)]"" S HLERR=$P(HLMSA,HLFS,4)
 . S HLAC=$S(HLMTN="MCF":2,HLAC'="AA":4,1:3)
 . D STATUS^HLTF0(HLDA,HLAC,$G(HLMSG))
 ;
 I $D(HLSEC) D
 . I $D(HLSDT) S I="",I=$O(^TMP("HLS",$J,HLSDT,I)),$P(^TMP("HLS",$J,HLSDT,I),HLFS,8)=HLSEC
 . I '$D(HLSDT) S I="",I=$O(HLSDATA(I)),$P(HLSDATA(I),HLFS,8)=HLSEC
 ;
 K HLERR
 D SEND^HLLP,KILL
 K ^TMP("HLS",$J)
 Q
 ;
KILL ;Kill variables before receiving another HL7 message
 K HLB,HLC,HLC1,HLC2,HLCSUM,HLDA,HLDAN,HLDAP,HLDT,HLDT1,HLDUZ,HLECH,HLERR,HLESIG,HLFS,HLI,HLII,HLK,HLMID,HLMSA,HLMTN,HLPID,HLQ,HLROU,HLSA,HLSDATA,HLSDT,HLVER,X,X0,X1
 D NOW^%DTC S HLTIME=% K %,%H,%I Q
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HHLCHK   5140     printed  Sep 23, 2025@19:32:20                                                                                                                                                                                                       Page 2
HLCHK     ;AISC/SAW-Validate HL7 Messages Received ;3/24/2004  14:09
 +1       ;;1.6;HEALTH LEVEL SEVEN;**1,108**;Oct 13, 1995
 +2       ;This routine is used for the Version 1.5 Interface Only
 +3        DO CHK
           DO IN^HLTF(HLMTN,HLMID,HLTIME)
           SET HLMT=$SELECT(HLMTN="QRY":"ORF",HLMTN="ORM":"ORR",1:"ACK")
           DO MSH
           if $DATA(HLERR)
               GOTO ACK
 +4        KILL HLDATA,HLL,HLMSA,HLMT,HLMTP,^TMP("HLR",$JOB)
           IF HLROU="^NONE"!(HLROU="^")
               DO KILL
               QUIT 
 +5        DO @HLROU
           GOTO REPLY
MSH       ;Create MSH Segment for HL7 Reply
 +1        IF '$DATA(HLDT)!('$DATA(HLDT1))
               NEW %,%H,%I
               DO NOW^%DTC
               SET HLDT=%
               SET HLDT1=$$HLDATE^HLFNC(HLDT)
 +2        SET HLSDATA(1)="MSH"_HLFS_HLECH_HLFS_$PIECE(HLDATA,HLFS,5,6)_HLFS_$PIECE(HLDATA,HLFS,3,4)_HLFS_HLDT1_HLFS_HLFS_HLMT_HLFS_HLDT_HLFS_HLPID_HLFS_HLVER
           QUIT 
CHK       ;Validate Data in Header Segment of an HL7 Message
 +1        KILL HLERR
           SET HLDATA=HLL(1)
           SET HLFS=$EXTRACT(HLDATA,4)
           SET HLECH=$PIECE(HLDATA,HLFS,2)
           SET HLQ=""""""
           SET HLDAN=$PIECE(HLDATA,HLFS,5)
           SET HLMNT=""
           Begin DoDot:1
 +2            IF $EXTRACT(HLDATA,1,3)="BHS"
                   SET HLMID=$PIECE(HLDATA,HLFS,11)
                   SET X=$PIECE(HLDATA,HLFS,9)
                   SET HLPID=$PIECE(X,$EXTRACT(HLECH),2)
                   SET HLMTN=$EXTRACT($PIECE(X,$EXTRACT(HLECH),3),1,3)
                   SET HLVER=$PIECE(X,$EXTRACT(HLECH),4)
                   if $PIECE(HLDATA,HLFS,10)]""
                       SET HLMSA=$PIECE(HLDATA,HLFS,10)
                       SET $PIECE(HLMSA,$EXTRACT(HLECH),2)=$PIECE(HLDATA,HLFS,12)
 +3            IF $EXTRACT(HLDATA,1,3)="MSH"
                   SET HLMID=$PIECE(HLDATA,HLFS,10)
                   SET HLPID=$PIECE(HLDATA,HLFS,11)
                   SET HLMTN=$PIECE($PIECE(HLDATA,HLFS,9),$EXTRACT(HLECH))
                   SET HLVER=$PIECE(HLDATA,HLFS,12)
                   if HLMTN=""
                       SET HLMTN=0
                   IF $EXTRACT($GET(HLL(2)),1,3)="MSA"
                       SET HLMSA=HLL(2)
           End DoDot:1
 +4        IF HLMTN']""
               SET HLERR="Invalid Message Type"
               QUIT 
 +5        IF '$DATA(^HL(771.2,"B",HLMTN))
               SET HLERR="Invalid Message Type"
               QUIT 
 +6        IF HLFS=""!(HLFS?.C)
               SET HLERR="Invalid Header Segment"
               QUIT 
 +7        IF $EXTRACT(HLDATA,1,3)'="MSH"
               IF $EXTRACT(HLDATA,1,3)'="BHS"
                   SET HLERR="Invalid Header Segment"
                   QUIT 
 +8        IF HLDAN']""
               SET HLERR="Invalid Receiving Application"
               QUIT 
 +9       ; patch HL*1.6*108 start
 +10      ;S HLDAP=+$O(^HL(771,"B",HLDAN,0)) I 'HLDAP S HLDAN=$$UPPER^HLFNC(HLDAN),HLDAP=+$O(^HL(771,"B",HLDAN,0))
 +11       SET HLDAP=+$ORDER(^HL(771,"B",$EXTRACT(HLDAN,1,30),0))
           IF 'HLDAP
               SET HLDAN=$$UPPER^HLFNC(HLDAN)
               SET HLDAP=+$ORDER(^HL(771,"B",$EXTRACT(HLDAN,1,30),0))
 +12      ; patch HL*!.6*108 end
 +13      ;
 +14       IF 'HLDAP
               SET HLERR="Invalid Receiving Application"
               QUIT 
 +15       IF '$DATA(^HL(771,HLDAP,0))
               SET HLERR="Invalid Receiving Application"
               QUIT 
 +16       IF $PIECE(^HL(771,HLDAP,0),"^",2)'="a"
               SET HLERR="Receiving Application is Inactive"
               QUIT 
 +17       SET X=$PIECE(HLDATA,HLFS,3)
           IF X']""
               SET HLERR="Invalid Sending Application"
               QUIT 
 +18       IF '$DATA(^HL(770,"AF",X))
               SET X=$$UPPER^HLFNC(X)
 +19       IF '$DATA(^HL(770,"AF",X))
               SET HLERR="Invalid Sending Application"
               QUIT 
 +20       SET HLSA=X
           SET X=$PIECE(HLDATA,HLFS,4)
           IF X']""
               SET HLERR="Invalid Sending Facility"
               QUIT 
 +21       IF '$DATA(^HL(770,"AF",HLSA,X))
               SET X=$$UPPER^HLFNC(X)
 +22       IF '$DATA(^HL(770,"AF",HLSA,X))
               SET HLERR="Invalid Sending Facility"
               QUIT 
 +23       SET X=$PIECE(HLDATA,HLFS,6)
           SET X=$$UPPER^HLFNC(X)
           IF X']""
               SET HLERR="Invalid Receiving Facility"
               QUIT 
 +24       IF '$DATA(^HL(770,"AE",HLSA,X))
               SET HLERR="Invalid Receiving Facility"
               QUIT 
 +25       IF '$DATA(HLNDAP0)
               SET HLNDAP=+$ORDER(^HL(770,"B",HLSA,0))
               SET HLNDAP0=$GET(^HL(770,HLNDAP,0))
               if $PIECE(HLNDAP0,"^",6)]""
                   SET HLION=$PIECE(HLNDAP0,"^",6)
 +26       IF HLVER']""
               SET HLERR="Invalid HL7 Version"
               QUIT 
 +27       SET X=$ORDER(^HL(771.5,"B",HLVER,0))
           IF 'X
               SET HLERR="Invalid HL7 Version"
               QUIT 
 +28       IF X'=$PIECE(^HL(770,+$ORDER(^HL(770,"B",HLSA,0)),0),"^",7)
               SET HLERR="Invalid HL7 version for Receiving Application"
               QUIT 
 +29       IF "DTP"'[HLPID
               SET HLERR="Inappropriate HL7 Processing ID"
               QUIT 
 +30       SET HLMTP=+$ORDER(^HL(771.2,"B",HLMTN,0))
           IF HLMTN'="ACK"
               IF '$ORDER(^HL(771,HLDAP,"MSG","B",HLMTP,0))
                   SET HLERR="Invalid Message Type for Receiving Application"
                   QUIT 
 +31       SET HLROU=$GET(^HL(771,HLDAP,"MSG",+$ORDER(^HL(771,HLDAP,"MSG","B",HLMTP,0)),"R"))
           IF HLROU']""!(HLROU="NONE")
               IF HLMTN'="ACK"
                   IF HLMTN'="MCF"
                       SET HLERR="Invalid Message Type for Receiving Application"
                       QUIT 
 +32       SET X=$PIECE($PIECE(HLDATA,HLFS,8),$EXTRACT(HLECH))
           SET X=$$UPPER^HLFNC(X)
           DO ^XUSHSH
           Begin DoDot:1
 +33           IF X']""
                   if HLMTN'="ACK"&(HLMTN'="MCF")&(HLMTN'="ORR")
                       SET HLDUZ=0
                   QUIT 
 +34           SET HLDUZ=+$ORDER(^VA(200,"A",X,0))
               IF '$DATA(^VA(200,HLDUZ,.1))
                   IF HLMTN'="ACK"
                       IF HLMTN'="MCF"
                           IF HLMTN'="ORR"
                               SET HLDUZ=0
           End DoDot:1
           if $DATA(HLERR)
               QUIT 
 +35       SET X=$PIECE($PIECE(HLDATA,HLFS,8),$EXTRACT(HLECH),3)
           IF X]""
               Begin DoDot:1
 +36               IF '$DATA(^VA(200,HLDUZ,20))
                       SET HLERR="No Signature Code on File"
                       QUIT 
 +37               SET X=$$UPPER^HLFNC(X)
                   DO HASH^XUSHSHP
                   IF X'=$PIECE(^VA(200,HLDUZ,20),"^",4)!($PIECE(^(20),"^",2)']"")
                       SET HLERR="Invalid Electronic Signature Code"
                       QUIT 
 +38               SET HLESIG=$PIECE(^VA(200,HLDUZ,20),"^",2)
               End DoDot:1
               if $DATA(HLERR)
                   QUIT 
 +39       if HLROU'["^"
               SET HLROU="^"_HLROU
           QUIT 
ACK       ;Create and Send 'AR' Error Type Acknowledgement Message
 +1        KILL HLDATA,HLL,^TMP("HLR",$JOB)
           SET HLSDATA(2)="MSA"_HLFS_"AR"_HLFS_HLMID_HLFS_HLERR
 +2        KILL HLERR
           DO SEND^HLLP
           DO KILL
 +3        QUIT 
 +4       ;
REPLY     ;Send a Reply/Ack to a HL7 Message Received
 +1        NEW I,HLAC,HLMSG,HLERR
 +2        IF $DATA(HLSDT)
               SET I=""
               SET I=$ORDER(^TMP("HLS",$JOB,HLSDT,I))
               SET I=$ORDER(^(I))
               SET HLMSA=$GET(^(+I))
 +3        IF '$DATA(HLSDT)
               IF $DATA(HLSDATA)
                   SET I=""
                   SET I=$ORDER(HLSDATA(I))
                   SET I=$ORDER(HLSDATA(I))
                   SET HLMSA=$GET(HLSDATA(+I))
 +4        IF $DATA(HLMSA)
               IF $DATA(HLDAP)
                   IF HLDAP
                       IF $EXTRACT(HLMSA,1,3)="MSA"
                           SET HLMSG=""
                           Begin DoDot:1
 +5                            SET HLAC=$PIECE(HLMSA,HLFS,2)
 +6                            if (HLAC="")!('$DATA(HLNDAP))
                                   QUIT 
 +7                            IF $PIECE(HLMSA,HLFS,4)]""
                                   SET HLERR=$PIECE(HLMSA,HLFS,4)
 +8                            SET HLAC=$SELECT(HLMTN="MCF":2,HLAC'="AA":4,1:3)
 +9                            DO STATUS^HLTF0(HLDA,HLAC,$GET(HLMSG))
                           End DoDot:1
 +10      ;
 +11       IF $DATA(HLSEC)
               Begin DoDot:1
 +12               IF $DATA(HLSDT)
                       SET I=""
                       SET I=$ORDER(^TMP("HLS",$JOB,HLSDT,I))
                       SET $PIECE(^TMP("HLS",$JOB,HLSDT,I),HLFS,8)=HLSEC
 +13               IF '$DATA(HLSDT)
                       SET I=""
                       SET I=$ORDER(HLSDATA(I))
                       SET $PIECE(HLSDATA(I),HLFS,8)=HLSEC
               End DoDot:1
 +14      ;
 +15       KILL HLERR
 +16       DO SEND^HLLP
           DO KILL
 +17       KILL ^TMP("HLS",$JOB)
 +18       QUIT 
 +19      ;
KILL      ;Kill variables before receiving another HL7 message
 +1        KILL HLB,HLC,HLC1,HLC2,HLCSUM,HLDA,HLDAN,HLDAP,HLDT,HLDT1,HLDUZ,HLECH,HLERR,HLESIG,HLFS,HLI,HLII,HLK,HLMID,HLMSA,HLMTN,HLPID,HLQ,HLROU,HLSA,HLSDATA,HLSDT,HLVER,X,X0,X1
 +2        DO NOW^%DTC
           SET HLTIME=%
           KILL %,%H,%I
           QUIT