| 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
 | 
|---|