Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: PSXDODB1

PSXDODB1.m

Go to the documentation of this file.
  1. PSXDODB1 ;BIR/HTW-HL7 2.1 FILE AND PATIENT SAFETY CHECKS ;01/15/02 13:10:52
  1. ;;2.0;CMOP;**45**;11 Apr 97
  1. ;
  1. Q
  1. ;Returns PSXERR="" if passed, if not PSXERR='error format in EDI document'
  1. ;called by PSXDODB
  1. ;if the file fails a negative ack is placed in the outbox and a mailmessage
  1. ;is sent using GRP1^PSXNOTE, and the file is placed in the pending box.
  1. ;This process does not move it to archive nor remove it from the inbox.
  1. EN D BLDSEQ
  1. K BTS
  1. TESTBT ;test the sequence of the messages in the batch
  1. ; stored in ^TMP($J,"PSXDOD",I)
  1. S PSXERR="",LSEG="",PTCNT=0,ORDCNT=0
  1. F LNNUM=1:1 S LN=$G(^TMP($J,"PSXDOD",LNNUM)) Q:LN="" D Q:$G(SEGSTOP)
  1. . I $E(LN)="$" S SEG=$P(LN,"^") I 1 ; discern $seg^ vs "seg|"
  1. . E S SEG=$P(LN,"|")
  1. . S:SEG="NTE" SEG=$P(LN,"|",1,2)
  1. . Q:SEG="$$ENDXMIT"
  1. . ;I $E(IOST)="C" W " ",SEG," "
  1. . I LNNUM=1,SEG="$$XMIT" S LSEG=SEG,XMIT=LN Q
  1. . I '$D(SEGSEQ(LSEG,SEG)) S PSXERR=PSXERR_$S($L(PSXERR):"~",1:"")_"SEQ^"_LSEG_U_SEG S LSEG=SEG,SEGSTOP=1 Q
  1. . S LSEG=SEG
  1. . I "BHS,$MSG,MSH,RX1,ZX1,PID,BTS"[SEG D CHECK
  1. ;
  1. I PSXERR="",$G(BTS)="" S PSXERR=PSXERR_$S($L(PSXERR):"~",1:"")_"56^" D
  1. . I $E(IOST)="C" W !,"Batch Orders ",PSXERR,!,$G(PTCNTB),?40,$G(PTCNT)
  1. ;
  1. I PSXERR="" G EXIT ; FILE PASSED SAFETY CHECKS
  1. ; FILE FAILED SAFETY CHECK send neg ack
  1. K ACK
  1. S ACK="MSH|^~\&|VistA||CHCS||20010925202704||ORM^O02|573-013240530|P|2.3.1|||NE|NE"
  1. S BATID=$G(BATIDB)
  1. D NOW^%DTC S BATDTM=+$$HLDATE^HLFNC(%)
  1. F YY="BATID^10","BATDTM^7" D PUT(.ACK,"|",YY)
  1. S ACK(1)=ACK,ACK(2)="MSA|CR|"_BATID
  1. I PSXERR'="" S ACK(2)=ACK(2)_"|"_PSXERR
  1. S FNAME2=$P(FNAME,".",1)_".TAC",PATH=$$GET1^DIQ(554,1,21)
  1. F XX=1:1:5 S Y=$$GTF^%ZISH("ACK(1)",1,PATH,FNAME2) Q:Y=1 H 4
  1. I Y'=1 S GBL="ACK" D FALERT^PSXDODNT(FNAME2,PATH,GBL)
  1. S PATH=$$GET1^DIQ(554,1,22)
  1. F XX=1:1:5 S Y=$$GTF^%ZISH("ACK(1)",1,PATH,FNAME2) Q:Y=1 H 4
  1. I Y'=1 S GBL="ACK" D FALERT^PSXDODNT(FNAME2,PATH,GBL)
  1. ERRMSG ;send error message to PSXCMOPMGR key and copy file to pending.
  1. S DIRHOLD=$$GET1^DIQ(554,1,23)
  1. S Y=$$GTF^%ZISH($NA(^TMP($J,"PSXDOD",1)),3,DIRHOLD,FNAME)
  1. S XMSUB="DOD CMOP Safety ALERT "_FNAME
  1. D GRP1^PSXNOTE
  1. ;S XMY(DUZ)="" ;***TESTING
  1. S XMTEXT="PSXTXT("
  1. S PSXTXT(1,0)="DOD CMOP File/Data Patient Safety checker found an error"
  1. S PSXTXT(2,0)="FILE: "_FNAME
  1. S PSXTXT(3,0)="A copy of the file has been placed in the hold directory "_DIRHOLD
  1. S PSXTXT(4,0)="The Error code given back to DoD is:"
  1. 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
  1. D ^XMD
  1. I $E(IOST)="C" W ! F I=1:1:4 W !,PSXTXT(I,0) I I=4 H 3
  1. K PSXTXT,DIRHOLD
  1. G EXIT
  1. CHECK ;patient safety check; pull variables from segments/elements
  1. I SEG="BHS" S BATIDB=$P(LN,"|",11),BHS=LN Q
  1. I SEG="$MSG" S ORDSEQG=$P(LN,U,2) Q
  1. I SEG="MSH" S BATIDM=$P(LN,"|",10),ORDSEQH=$P(BATIDM,"-",3),BATIDM=$P(BATIDM,"-",1,2) D
  1. .I BATIDM'=BATIDB S PSXERR=PSXERR_$S($L(PSXERR):"^",1:"")_"22~"_BATIDM_"~"_ORDSEQH D
  1. .. I $E(IOST)="C" W !,"Order Batch ID ",PSXERR,!,BATIDM,?40,BATIDB
  1. .I ORDSEQH'=ORDSEQG S PSXERR=PSXERR_$S($L(PSXERR):"^",1:"")_"22~"_ORDSEQG D
  1. .. I $E(IOST)="C" W !,"Order Sequence ",PSXERR,!,ORDSEQG,?40,ORDSEQH
  1. I SEG="RX1" S RXIDR=$P(LN,"|",27),ORDCNT=ORDCNT+1 Q
  1. I SEG="ZX1" S RXIDZ=$P(LN,"|",2) I RXIDZ'=RXIDR S PSXERR=PSXERR_$S($L(PSXERR):"^",1:"")_"44~"_ORDSEQH_U D Q
  1. . I $E(IOST)="C" W !,"RX Number ",PSXERR,!,RXIDR,?40,RXIDZ
  1. I SEG="PID" S PTCNT=PTCNT+1 Q
  1. I SEG="BTS" S PTCNTB=$P(LN,"|",2),ORDCNTB=$P(LN,"|",4),BTS=LN D
  1. . I PTCNTB'=PTCNT S PSXERR=PSXERR_$S($L(PSXERR):"^",1:"")_"56~" D
  1. .. I $E(IOST)="C" W !,"Batch Orders ",PSXERR,!,PTCNTB,?40,PTCNT
  1. . I ORDCNTB'=ORDCNT S PSXERR=PSXERR_$S($L(PSXERR):"^",1:"")_"58~" D
  1. .. I $E(IOST)="C" W !,"Batch Totals ",PSXERR,!,ORDCNTB,?40,ORDCNT
  1. Q
  1. BLDSEQ ;build check sequence of SEGMENTS
  1. K SEGSEQ
  1. F I=1:1 S LINE=$P($T(SEGBLD+I),";;",2,99) Q:LINE["$$END$" D
  1. . S LSEG=$P(LINE,";;")
  1. . F J=2:1 S SEG=$P(LINE,";;",J) Q:SEG="" S SEGSEQ(LSEG,SEG)="" ;W !,LSEG,?10,SEG
  1. Q
  1. SEGBLD ; data for checking sequencing of segments.
  1. ;;$$XMIT;;BHS
  1. ;;BHS;;ORC
  1. ;;ORC;;NTE|1;;NTE|2;;NTE|3;;NTE|4;;$MSG
  1. ;;NTE|1;;NTE|2;;NTE|3;;NTE|4;;$MSG
  1. ;;NTE|2;;NTE|2;;NTE|3;;NTE|4;;$MSG
  1. ;;NTE|3;;NTE|3;;NTE|4;;$MSG
  1. ;;NTE|4;;NTE|4;;$MSG
  1. ;;$MSG;;MSH
  1. ;;MSH;;PID
  1. ;;PID;;NTE|8;;ORC
  1. ;;NTE|8;;ORC;;NTE|8
  1. ;;ORC;;RX1
  1. ;;RX1;;ZX1;;NTE|7
  1. ;;NTE|7;;NTE|7;;ZX1
  1. ;;ZX1;;ORC;;BTS;;$MSG;;PID;;ORC
  1. ;;BTS;;$$ENDXMIT
  1. ;;$$END$
  1. Q
  1. PIECE(REC,DLM,XX) ;
  1. ; Set variable V = piece P of REC using delimiter DLM
  1. N V,P S V=$P(XX,U),P=$P(XX,U,2),@V=$P(REC,DLM,P)
  1. Q
  1. PUT(REC,DLM,XX) ;
  1. ; Set Variable V into piece P of REC using delimiter DLM
  1. N V,P S V=$P(XX,U),P=$P(XX,U,2)
  1. S $P(REC,DLM,P)=$G(@V)
  1. Q
  1. EXIT ;
  1. K BTS,SEGSEQ,PTCNT,PTCNTB,ORDCNT,ORDCNTB,RXIDR,RXIDZ,BATID,BATIDM,ORDSEQH,BHS,ORDSEQG
  1. K BATDTM,BATIDB,FNAME2,LN,LNNUM,LSEG,SEG,YY,XMIT,LINE,SEGSTOP
  1. Q
  1. LOAD ; used for testing seperate from the call from PSXDODB
  1. K ^TMP($J,"PSXDOD")
  1. S GBL="^TMP("_$J_",""PSXDOD"",1)"
  1. S PATH=$$GET1^DIQ(554,1,20)
  1. S FNAME="0029_022751430_2.TRN"
  1. S Y=$$FTG^%ZISH(PATH,FNAME,GBL,3)
  1. Q