| 1 | PSXDODB1 ;BIR/HTW-HL7 2.1 FILE AND PATIENT SAFETY CHECKS ;01/15/02 13:10:52 | 
|---|
| 2 | ;;2.0;CMOP;**45**;11 Apr 97 | 
|---|
| 3 | ; | 
|---|
| 4 | Q | 
|---|
| 5 | ;Returns PSXERR="" if passed, if not PSXERR='error format in EDI document' | 
|---|
| 6 | ;called by PSXDODB | 
|---|
| 7 | ;if the file fails a negative ack is placed in the outbox and a mailmessage | 
|---|
| 8 | ;is sent using GRP1^PSXNOTE, and the file is placed in the pending box. | 
|---|
| 9 | ;This process does not move it to archive nor remove it from the inbox. | 
|---|
| 10 | EN D BLDSEQ | 
|---|
| 11 | K BTS | 
|---|
| 12 | TESTBT ;test the sequence of the messages in the batch | 
|---|
| 13 | ; stored in ^TMP($J,"PSXDOD",I) | 
|---|
| 14 | S PSXERR="",LSEG="",PTCNT=0,ORDCNT=0 | 
|---|
| 15 | F LNNUM=1:1 S LN=$G(^TMP($J,"PSXDOD",LNNUM)) Q:LN=""  D  Q:$G(SEGSTOP) | 
|---|
| 16 | . I $E(LN)="$" S SEG=$P(LN,"^") I 1 ; discern $seg^  vs "seg|" | 
|---|
| 17 | . E  S SEG=$P(LN,"|") | 
|---|
| 18 | . S:SEG="NTE" SEG=$P(LN,"|",1,2) | 
|---|
| 19 | . Q:SEG="$$ENDXMIT" | 
|---|
| 20 | . ;I $E(IOST)="C" W " ",SEG," " | 
|---|
| 21 | . I LNNUM=1,SEG="$$XMIT" S LSEG=SEG,XMIT=LN Q | 
|---|
| 22 | . I '$D(SEGSEQ(LSEG,SEG)) S PSXERR=PSXERR_$S($L(PSXERR):"~",1:"")_"SEQ^"_LSEG_U_SEG S LSEG=SEG,SEGSTOP=1 Q | 
|---|
| 23 | . S LSEG=SEG | 
|---|
| 24 | . I "BHS,$MSG,MSH,RX1,ZX1,PID,BTS"[SEG D CHECK | 
|---|
| 25 | ; | 
|---|
| 26 | I PSXERR="",$G(BTS)="" S PSXERR=PSXERR_$S($L(PSXERR):"~",1:"")_"56^" D | 
|---|
| 27 | . I $E(IOST)="C" W !,"Batch Orders ",PSXERR,!,$G(PTCNTB),?40,$G(PTCNT) | 
|---|
| 28 | ; | 
|---|
| 29 | I PSXERR="" G EXIT ; FILE PASSED SAFETY CHECKS | 
|---|
| 30 | ; FILE FAILED SAFETY CHECK send neg ack | 
|---|
| 31 | K ACK | 
|---|
| 32 | S ACK="MSH|^~\&|VistA||CHCS||20010925202704||ORM^O02|573-013240530|P|2.3.1|||NE|NE" | 
|---|
| 33 | S BATID=$G(BATIDB) | 
|---|
| 34 | D NOW^%DTC S BATDTM=+$$HLDATE^HLFNC(%) | 
|---|
| 35 | F YY="BATID^10","BATDTM^7" D PUT(.ACK,"|",YY) | 
|---|
| 36 | S ACK(1)=ACK,ACK(2)="MSA|CR|"_BATID | 
|---|
| 37 | I PSXERR'="" S ACK(2)=ACK(2)_"|"_PSXERR | 
|---|
| 38 | S FNAME2=$P(FNAME,".",1)_".TAC",PATH=$$GET1^DIQ(554,1,21) | 
|---|
| 39 | F XX=1:1:5 S Y=$$GTF^%ZISH("ACK(1)",1,PATH,FNAME2) Q:Y=1  H 4 | 
|---|
| 40 | I Y'=1 S GBL="ACK" D FALERT^PSXDODNT(FNAME2,PATH,GBL) | 
|---|
| 41 | S PATH=$$GET1^DIQ(554,1,22) | 
|---|
| 42 | F XX=1:1:5 S Y=$$GTF^%ZISH("ACK(1)",1,PATH,FNAME2) Q:Y=1  H 4 | 
|---|
| 43 | I Y'=1 S GBL="ACK" D FALERT^PSXDODNT(FNAME2,PATH,GBL) | 
|---|
| 44 | ERRMSG ;send error message to PSXCMOPMGR key and copy file to pending. | 
|---|
| 45 | S DIRHOLD=$$GET1^DIQ(554,1,23) | 
|---|
| 46 | S Y=$$GTF^%ZISH($NA(^TMP($J,"PSXDOD",1)),3,DIRHOLD,FNAME) | 
|---|
| 47 | S XMSUB="DOD CMOP Safety ALERT "_FNAME | 
|---|
| 48 | D GRP1^PSXNOTE | 
|---|
| 49 | ;S XMY(DUZ)="" ;***TESTING | 
|---|
| 50 | S XMTEXT="PSXTXT(" | 
|---|
| 51 | S PSXTXT(1,0)="DOD CMOP File/Data Patient Safety checker found an error" | 
|---|
| 52 | S PSXTXT(2,0)="FILE: "_FNAME | 
|---|
| 53 | S PSXTXT(3,0)="A copy of the file has been placed in the hold directory "_DIRHOLD | 
|---|
| 54 | S PSXTXT(4,0)="The Error code given back to DoD is:" | 
|---|
| 55 | S L=$L(PSXERR) F I=1:1:1+(L\200) S XX=$E(PSXERR,(I-1)*200,I*200),PSXTXT(4+I,0)=XX | 
|---|
| 56 | D ^XMD | 
|---|
| 57 | I $E(IOST)="C" W ! F I=1:1:4 W !,PSXTXT(I,0) I I=4 H 3 | 
|---|
| 58 | K PSXTXT,DIRHOLD | 
|---|
| 59 | G EXIT | 
|---|
| 60 | CHECK ;patient safety check; pull variables from segments/elements | 
|---|
| 61 | I SEG="BHS" S BATIDB=$P(LN,"|",11),BHS=LN Q | 
|---|
| 62 | I SEG="$MSG" S ORDSEQG=$P(LN,U,2) Q | 
|---|
| 63 | I SEG="MSH" S BATIDM=$P(LN,"|",10),ORDSEQH=$P(BATIDM,"-",3),BATIDM=$P(BATIDM,"-",1,2) D | 
|---|
| 64 | .I BATIDM'=BATIDB S PSXERR=PSXERR_$S($L(PSXERR):"^",1:"")_"22~"_BATIDM_"~"_ORDSEQH D | 
|---|
| 65 | .. I $E(IOST)="C" W !,"Order Batch ID ",PSXERR,!,BATIDM,?40,BATIDB | 
|---|
| 66 | .I ORDSEQH'=ORDSEQG S PSXERR=PSXERR_$S($L(PSXERR):"^",1:"")_"22~"_ORDSEQG D | 
|---|
| 67 | .. I $E(IOST)="C" W !,"Order Sequence ",PSXERR,!,ORDSEQG,?40,ORDSEQH | 
|---|
| 68 | I SEG="RX1" S RXIDR=$P(LN,"|",27),ORDCNT=ORDCNT+1 Q | 
|---|
| 69 | I SEG="ZX1" S RXIDZ=$P(LN,"|",2) I RXIDZ'=RXIDR S PSXERR=PSXERR_$S($L(PSXERR):"^",1:"")_"44~"_ORDSEQH_U D  Q | 
|---|
| 70 | . I $E(IOST)="C" W !,"RX Number ",PSXERR,!,RXIDR,?40,RXIDZ | 
|---|
| 71 | I SEG="PID" S PTCNT=PTCNT+1 Q | 
|---|
| 72 | I SEG="BTS" S PTCNTB=$P(LN,"|",2),ORDCNTB=$P(LN,"|",4),BTS=LN D | 
|---|
| 73 | . I PTCNTB'=PTCNT S PSXERR=PSXERR_$S($L(PSXERR):"^",1:"")_"56~" D | 
|---|
| 74 | .. I $E(IOST)="C" W !,"Batch Orders ",PSXERR,!,PTCNTB,?40,PTCNT | 
|---|
| 75 | . I ORDCNTB'=ORDCNT S PSXERR=PSXERR_$S($L(PSXERR):"^",1:"")_"58~" D | 
|---|
| 76 | .. I $E(IOST)="C" W !,"Batch Totals ",PSXERR,!,ORDCNTB,?40,ORDCNT | 
|---|
| 77 | Q | 
|---|
| 78 | BLDSEQ ;build check sequence of SEGMENTS | 
|---|
| 79 | K SEGSEQ | 
|---|
| 80 | F I=1:1 S LINE=$P($T(SEGBLD+I),";;",2,99) Q:LINE["$$END$"  D | 
|---|
| 81 | . S LSEG=$P(LINE,";;") | 
|---|
| 82 | . F J=2:1 S SEG=$P(LINE,";;",J) Q:SEG=""  S SEGSEQ(LSEG,SEG)="" ;W !,LSEG,?10,SEG | 
|---|
| 83 | Q | 
|---|
| 84 | SEGBLD ; data for checking sequencing of segments. | 
|---|
| 85 | ;;$$XMIT;;BHS | 
|---|
| 86 | ;;BHS;;ORC | 
|---|
| 87 | ;;ORC;;NTE|1;;NTE|2;;NTE|3;;NTE|4;;$MSG | 
|---|
| 88 | ;;NTE|1;;NTE|2;;NTE|3;;NTE|4;;$MSG | 
|---|
| 89 | ;;NTE|2;;NTE|2;;NTE|3;;NTE|4;;$MSG | 
|---|
| 90 | ;;NTE|3;;NTE|3;;NTE|4;;$MSG | 
|---|
| 91 | ;;NTE|4;;NTE|4;;$MSG | 
|---|
| 92 | ;;$MSG;;MSH | 
|---|
| 93 | ;;MSH;;PID | 
|---|
| 94 | ;;PID;;NTE|8;;ORC | 
|---|
| 95 | ;;NTE|8;;ORC;;NTE|8 | 
|---|
| 96 | ;;ORC;;RX1 | 
|---|
| 97 | ;;RX1;;ZX1;;NTE|7 | 
|---|
| 98 | ;;NTE|7;;NTE|7;;ZX1 | 
|---|
| 99 | ;;ZX1;;ORC;;BTS;;$MSG;;PID;;ORC | 
|---|
| 100 | ;;BTS;;$$ENDXMIT | 
|---|
| 101 | ;;$$END$ | 
|---|
| 102 | Q | 
|---|
| 103 | PIECE(REC,DLM,XX) ; | 
|---|
| 104 | ; Set variable V = piece P of REC using delimiter DLM | 
|---|
| 105 | N V,P S V=$P(XX,U),P=$P(XX,U,2),@V=$P(REC,DLM,P) | 
|---|
| 106 | Q | 
|---|
| 107 | PUT(REC,DLM,XX) ; | 
|---|
| 108 | ; Set Variable V into piece P of REC using delimiter DLM | 
|---|
| 109 | N V,P S V=$P(XX,U),P=$P(XX,U,2) | 
|---|
| 110 | S $P(REC,DLM,P)=$G(@V) | 
|---|
| 111 | Q | 
|---|
| 112 | EXIT ; | 
|---|
| 113 | K BTS,SEGSEQ,PTCNT,PTCNTB,ORDCNT,ORDCNTB,RXIDR,RXIDZ,BATID,BATIDM,ORDSEQH,BHS,ORDSEQG | 
|---|
| 114 | K BATDTM,BATIDB,FNAME2,LN,LNNUM,LSEG,SEG,YY,XMIT,LINE,SEGSTOP | 
|---|
| 115 | Q | 
|---|
| 116 | LOAD ; used for testing seperate from the call from PSXDODB | 
|---|
| 117 | K ^TMP($J,"PSXDOD") | 
|---|
| 118 | S GBL="^TMP("_$J_",""PSXDOD"",1)" | 
|---|
| 119 | S PATH=$$GET1^DIQ(554,1,20) | 
|---|
| 120 | S FNAME="0029_022751430_2.TRN" | 
|---|
| 121 | S Y=$$FTG^%ZISH(PATH,FNAME,GBL,3) | 
|---|
| 122 | Q | 
|---|