- PSXDODB ;BIR/HTW-HL7 Message Conversion ;25 Jul 2002 10:02 PM
- ;;2.0;CMOP;**38,45**;11 Apr 97
- ; This routine loads a Businessware-converted 2.1 message into a mailman message
- EN(PATH,FNAME) ; needs directory & file name
- ; force an error in the next line
- I $L(PATH),$L(FNAME) I 1
- E S PSXERR="0^BAD PATH OR FILENAME" G ERRMSG
- K ^TMP($J,"PSXDOD")
- S GBL="^TMP("_$J_",""PSXDOD"",1)"
- S Y=$$FTG^%ZISH(PATH,FNAME,GBL,3)
- I Y'>0 S PSXERR="9^"_PATH_U_FNAME_U_" DID NOT LOAD" G ERRMSG
- I $D(^TMP($J,"PSXDOD"))'>1 S PSXERR="9^"_PATH_U_FNAME_U_" DID NOT LOAD" G ERRMSG
- EN1 ;
- S PSXERR=""
- D EN^PSXDODB1 ;returns PSXERR="" if file is OK ; otherwise it sends negative ack, mail message, copies to pending
- G:PSXERR'="" EXIT
- S GL="^TMP($J,""PSXDOD"")" ; for global indirection
- ; Work through translated 2.1 file and add 1 prefix to site ids
- ; correct Patient name. provider name, remove BTS segment
- F Z=0:0 S Z=$O(^TMP($J,"PSXDOD",Z)) Q:$G(Z)'>0 S G="^TMP($J,""PSXDOD"""_","_Z_")" D
- .I $G(@G)["BTS|" S @G=^TMP($J,"PSXDOD",Z+1) K ^TMP($J,"PSXDOD",Z+1) ;remove BTS segment if found
- .I $G(@G)["$END" S $P(@G,"^",3)=("1"_$P(@G,"^",3)) Q
- .I $G(@G)["$XMIT" S SITE="1"_$P(@G,"^",5),$P(@G,"^",5)=SITE,$P(@G,"^",11)=SITE,BATNM=$P(@G,"^",2),FACNM=$P(@G,"^",3),BATID=SITE_BATNM,XX=$P(@G,U,6),$P(@G,U,6)=$$FMDATE^HLFNC(XX),XM=$G(@G)
- .;I $G(@G)["NTE|1" S $P(@G,"|",4)=1_$P(@G,"|",4),$P(@G,"\S\",3)=SITE,NTE1=$G(@G)
- .I $G(@G)["NTE|1" S $P(@G,"|",4)=1_$P(@G,"|",4),F1=$P(@G,"\F\",1),$P(F1,"\S\",3)=SITE,$P(@G,"\F\",1)=F1,NTE1=$G(@G)
- .I $G(@G)["RX1" S $P(@G,"|",2)=1_$P(@G,"|",2)
- .;I $G(@G)["ZX1" S $P(@G,"|",3)=SITE
- .I $G(@G)["ZX1|" S $P(@G,"|",3)=1_$P(@G,"|",3) D
- ..S PRVNM=$P(@G,"|",7) Q:PRVNM'[" ,"
- ..S PRVNML=$P(PRVNM," ,"),PRVNMF=$P(PRVNM," ,",2),PRVNM=PRVNML_", "_PRVNMF
- ..S $P(@G,"|",7)=PRVNM
- ..K PRVNM,PRVNML,PRVNMF
- .;remore 2nd and following "^" in patient name
- .I $G(@G)["PID|" D
- .. S PTNM=$P(@G,"|",6),PTNML=$P(PTNM,"^"),PTNMF=$P(PTNM,"^",2,99),PTNMF=$TR(PTNMF,"^"," ")
- .. S PTNM=PTNML_"^"_PTNMF,$P(@G,"|",6)=PTNM
- .. K PTNM,PTNML,PTNMF
- ;
- EN2 ;entry for processing file into Vista Messages
- S (LNCNT,MCNT,LMSGLOC,ORDCNT)=0 ;line count, message line count, last $$MSG location, order count
- ;
- ;D HEADER^PSXDODH1 ; build $$XMIT & NTE|1 and set into Message
- S XMSUB="DOD CMOP "_SITE_"-"_BATNM_" from "_FACNM,XMDUZ=.5
- XMZ D XMZ^XMA2 G:XMZ'>0 XMZ
- S M="^XMB(3.9,XMZ,2)" ; variable reference to MailMan message for construction
- S @M@(1,0)=XM
- S @M@(2,0)=NTE1,MCNT=2
- S LNNUM=3 F S LNNUM=$O(@GL@(LNNUM)) Q:LNNUM'>0 S LN=@GL@(LNNUM),@M@(MCNT,0)=LN,MCNT=MCNT+1
- S ^XMB(3.9,XMZ,2,0)="^^"_MCNT_U_MCNT_U_DT
- S XMY("S.PSXX CMOP SERVER")="" ;****testing comment out
- ;S XMY(DUZ)="" H 1 ;****TESTING S.PSXX
- D ENT1^XMD
- D EXIT
- Q
- PIECE(REC,DLM,XX) ;
- ; Set variable V = piece P of REC using delimiter DLM
- N V,P S V=$P(XX,U),P=$P(XX,U,2),@V=$P(REC,DLM,P)
- Q
- PUT(REC,DLM,XX) ;
- ; Set Variable V into piece P of REC using delimiter DLM
- N V,P S V=$P(XX,U),P=$P(XX,U,2)
- S $P(REC,DLM,P)=$G(@V)
- Q
- GETELM(STR,PIECES,SEPS) ;
- ; uses STRing and
- ; returns value of the element located by path of pieces and separators
- ; ex: 1st address line = $$getelm(ORC,"22,1","|,^")
- ; or = $$getelm(XMIT,"4,2,1","|,\F\,\S|")
- N P,S,PI,V,I S V=STR
- F I=1:1 S PI=$P(PIECES,",",I) Q:PI="" S P=I,P(I)=PI,S(I)=$P(SEPS,",",I)
- F I=1:1:P S V=$P(V,S(I),P(I))
- Q V
- ERRMSG ;
- MSGSEQER ;send error message to folks & DOD
- ;W !,"error ",PSXERR
- S DIRHOLD=$$GET1^DIQ(554,1,23)
- S Y=$$GTF^%ZISH($NA(^TMP($J,"PSXDOD",1)),3,DIRHOLD,FNAME)
- S XMSUB="DOD CMOP Safty "_FNAME
- ;S XMY(DUZ)="" ;****TESTING
- S XMY("G.PSXX CMOP MANAGERS")=""
- S XMTEXT="PSXTXT("
- S PSXTXT(1,0)="DOD CMOP HL7 Conversion to VA CMOP HL7 experienced an error"
- S PSXTXT(2,0)=$G(PSXERR)
- S PSXTXT(3,0)="FILE: "_FNAME
- S PSXTXT(4,0)="A copy of the file has been placed in the hold directory "_DIRHOLD
- D ^XMD
- I $E(IOST)="C" W ! F I=1:1:4 W !,PSXTXT(I,0) I I=4 H 3
- K PSXTXT,DIRHOLD
- Q
- EXIT ;
- K BATIDB,BATIDM,BHS,BTS,DLM,DODORD,END,FHS,FNAME,G,GBL,I,J,JJ,LL,LINE,LMSGLOC
- K LN,LNCNT,LNNUM,LSEG,M,MCNT,MSH,NTE1,NTE2,NTE3,NTE4,NTE7,ORC,ORDCNT,ORDCNTB
- K P,P1,P2,P3,PATH,PI,PID,PNAME,PSXERR,PSXTXT,PTCNT,PTCNTB,REC,RX1,RXE,RXID1,RXIDC,RXIDE
- K S,S1,S2,S3,SEG,SEGSEQ,SEPS,STR,STR0,V,VALUE,XM,XX,Y,YY,ZR1,ZX1
- K ADDRESS,BATDTM,BATID,BATIDB,BATIDM,BATNM,DIVISION,DIVNM,DIVNUM,EXPDT,FACNM,FNAME2,FNAME3,ISSDT
- K LSTRFLDT,MAILID,NTE1ADD,NTE1DIV,NTE1LOC,PID0,PIECE,PRVPHY,PSXF,RFLDT,RXCNT,RXDATES,RXNUM,RXZNUM
- K SIG,SITEID,START,TRANDTS,XMZ
- K ^TMP($J,"PSXDOD"),PSXTXT
- Q
- LOADTMP ; load data into ^TMP
- K ^TMP($J,"PSXDOD")
- F I=1:1 S X=$G(^XMB(3.9,125829,2,I,0)) Q:X="" S ^TMP($J,"PSXDOD",I)=X
- Q
- CLEARFLS(XX,EXT) ;
- LOOP K PSXF,PSXL
- S PATH=$$GET1^DIQ(554,1,XX),PSXF(EXT)=""
- S Y=$$LIST^%ZISH(PATH,"PSXF","PSXL")
- W !,"path ",PATH,!,"files ",EXT
- Q:$D(PSXL)'>1
- S FILE="" F I=0:0 S FILE=$O(PSXL(FILE)) Q:FILE="" W !,FILE S I=I+1
- Q:I'>0
- K DIR S DIR(0)="Y",DIR("A")="DELETE FILES ?? ",DIR("B")="N" D ^DIR K DIR Q:Y'>0
- W $$DEL^%ZISH(PATH,"PSXL")
- G LOOP
- Q
- --- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HPSXDODB 5130 printed Mar 13, 2025@20:48:41 Page 2
- PSXDODB ;BIR/HTW-HL7 Message Conversion ;25 Jul 2002 10:02 PM
- +1 ;;2.0;CMOP;**38,45**;11 Apr 97
- +2 ; This routine loads a Businessware-converted 2.1 message into a mailman message
- EN(PATH,FNAME) ; needs directory & file name
- +1 ; force an error in the next line
- +2 IF $LENGTH(PATH)
- IF $LENGTH(FNAME)
- IF 1
- +3 IF '$TEST
- SET PSXERR="0^BAD PATH OR FILENAME"
- GOTO ERRMSG
- +4 KILL ^TMP($JOB,"PSXDOD")
- +5 SET GBL="^TMP("_$JOB_",""PSXDOD"",1)"
- +6 SET Y=$$FTG^%ZISH(PATH,FNAME,GBL,3)
- +7 IF Y'>0
- SET PSXERR="9^"_PATH_U_FNAME_U_" DID NOT LOAD"
- GOTO ERRMSG
- +8 IF $DATA(^TMP($JOB,"PSXDOD"))'>1
- SET PSXERR="9^"_PATH_U_FNAME_U_" DID NOT LOAD"
- GOTO ERRMSG
- EN1 ;
- +1 SET PSXERR=""
- +2 ;returns PSXERR="" if file is OK ; otherwise it sends negative ack, mail message, copies to pending
- DO EN^PSXDODB1
- +3 if PSXERR'=""
- GOTO EXIT
- +4 ; for global indirection
- SET GL="^TMP($J,""PSXDOD"")"
- +5 ; Work through translated 2.1 file and add 1 prefix to site ids
- +6 ; correct Patient name. provider name, remove BTS segment
- +7 FOR Z=0:0
- SET Z=$ORDER(^TMP($JOB,"PSXDOD",Z))
- if $GET(Z)'>0
- QUIT
- SET G="^TMP($J,""PSXDOD"""_","_Z_")"
- Begin DoDot:1
- +8 ;remove BTS segment if found
- IF $GET(@G)["BTS|"
- SET @G=^TMP($JOB,"PSXDOD",Z+1)
- KILL ^TMP($JOB,"PSXDOD",Z+1)
- +9 IF $GET(@G)["$END"
- SET $PIECE(@G,"^",3)=("1"_$PIECE(@G,"^",3))
- QUIT
- +10 IF $GET(@G)["$XMIT"
- SET SITE="1"_$PIECE(@G,"^",5)
- SET $PIECE(@G,"^",5)=SITE
- SET $PIECE(@G,"^",11)=SITE
- SET BATNM=$PIECE(@G,"^",2)
- SET FACNM=$PIECE(@G,"^",3)
- SET BATID=SITE_BATNM
- SET XX=$PIECE(@G,U,6)
- SET $PIECE(@G,U,6)=$$FMDATE^HLFNC(XX)
- SET XM=$GET(@G)
- +11 ;I $G(@G)["NTE|1" S $P(@G,"|",4)=1_$P(@G,"|",4),$P(@G,"\S\",3)=SITE,NTE1=$G(@G)
- +12 IF $GET(@G)["NTE|1"
- SET $PIECE(@G,"|",4)=1_$PIECE(@G,"|",4)
- SET F1=$PIECE(@G,"\F\",1)
- SET $PIECE(F1,"\S\",3)=SITE
- SET $PIECE(@G,"\F\",1)=F1
- SET NTE1=$GET(@G)
- +13 IF $GET(@G)["RX1"
- SET $PIECE(@G,"|",2)=1_$PIECE(@G,"|",2)
- +14 ;I $G(@G)["ZX1" S $P(@G,"|",3)=SITE
- +15 IF $GET(@G)["ZX1|"
- SET $PIECE(@G,"|",3)=1_$PIECE(@G,"|",3)
- Begin DoDot:2
- +16 SET PRVNM=$PIECE(@G,"|",7)
- if PRVNM'[" ,"
- QUIT
- +17 SET PRVNML=$PIECE(PRVNM," ,")
- SET PRVNMF=$PIECE(PRVNM," ,",2)
- SET PRVNM=PRVNML_", "_PRVNMF
- +18 SET $PIECE(@G,"|",7)=PRVNM
- +19 KILL PRVNM,PRVNML,PRVNMF
- End DoDot:2
- +20 ;remore 2nd and following "^" in patient name
- +21 IF $GET(@G)["PID|"
- Begin DoDot:2
- +22 SET PTNM=$PIECE(@G,"|",6)
- SET PTNML=$PIECE(PTNM,"^")
- SET PTNMF=$PIECE(PTNM,"^",2,99)
- SET PTNMF=$TRANSLATE(PTNMF,"^"," ")
- +23 SET PTNM=PTNML_"^"_PTNMF
- SET $PIECE(@G,"|",6)=PTNM
- +24 KILL PTNM,PTNML,PTNMF
- End DoDot:2
- End DoDot:1
- +25 ;
- EN2 ;entry for processing file into Vista Messages
- +1 ;line count, message line count, last $$MSG location, order count
- SET (LNCNT,MCNT,LMSGLOC,ORDCNT)=0
- +2 ;
- +3 ;D HEADER^PSXDODH1 ; build $$XMIT & NTE|1 and set into Message
- +4 SET XMSUB="DOD CMOP "_SITE_"-"_BATNM_" from "_FACNM
- SET XMDUZ=.5
- XMZ DO XMZ^XMA2
- if XMZ'>0
- GOTO XMZ
- +1 ; variable reference to MailMan message for construction
- SET M="^XMB(3.9,XMZ,2)"
- +2 SET @M@(1,0)=XM
- +3 SET @M@(2,0)=NTE1
- SET MCNT=2
- +4 SET LNNUM=3
- FOR
- SET LNNUM=$ORDER(@GL@(LNNUM))
- if LNNUM'>0
- QUIT
- SET LN=@GL@(LNNUM)
- SET @M@(MCNT,0)=LN
- SET MCNT=MCNT+1
- +5 SET ^XMB(3.9,XMZ,2,0)="^^"_MCNT_U_MCNT_U_DT
- +6 ;****testing comment out
- SET XMY("S.PSXX CMOP SERVER")=""
- +7 ;S XMY(DUZ)="" H 1 ;****TESTING S.PSXX
- +8 DO ENT1^XMD
- +9 DO EXIT
- +10 QUIT
- PIECE(REC,DLM,XX) ;
- +1 ; Set variable V = piece P of REC using delimiter DLM
- +2 NEW V,P
- SET V=$PIECE(XX,U)
- SET P=$PIECE(XX,U,2)
- SET @V=$PIECE(REC,DLM,P)
- +3 QUIT
- PUT(REC,DLM,XX) ;
- +1 ; Set Variable V into piece P of REC using delimiter DLM
- +2 NEW V,P
- SET V=$PIECE(XX,U)
- SET P=$PIECE(XX,U,2)
- +3 SET $PIECE(REC,DLM,P)=$GET(@V)
- +4 QUIT
- GETELM(STR,PIECES,SEPS) ;
- +1 ; uses STRing and
- +2 ; returns value of the element located by path of pieces and separators
- +3 ; ex: 1st address line = $$getelm(ORC,"22,1","|,^")
- +4 ; or = $$getelm(XMIT,"4,2,1","|,\F\,\S|")
- +5 NEW P,S,PI,V,I
- SET V=STR
- +6 FOR I=1:1
- SET PI=$PIECE(PIECES,",",I)
- if PI=""
- QUIT
- SET P=I
- SET P(I)=PI
- SET S(I)=$PIECE(SEPS,",",I)
- +7 FOR I=1:1:P
- SET V=$PIECE(V,S(I),P(I))
- +8 QUIT V
- ERRMSG ;
- MSGSEQER ;send error message to folks & DOD
- +1 ;W !,"error ",PSXERR
- +2 SET DIRHOLD=$$GET1^DIQ(554,1,23)
- +3 SET Y=$$GTF^%ZISH($NAME(^TMP($JOB,"PSXDOD",1)),3,DIRHOLD,FNAME)
- +4 SET XMSUB="DOD CMOP Safty "_FNAME
- +5 ;S XMY(DUZ)="" ;****TESTING
- +6 SET XMY("G.PSXX CMOP MANAGERS")=""
- +7 SET XMTEXT="PSXTXT("
- +8 SET PSXTXT(1,0)="DOD CMOP HL7 Conversion to VA CMOP HL7 experienced an error"
- +9 SET PSXTXT(2,0)=$GET(PSXERR)
- +10 SET PSXTXT(3,0)="FILE: "_FNAME
- +11 SET PSXTXT(4,0)="A copy of the file has been placed in the hold directory "_DIRHOLD
- +12 DO ^XMD
- +13 IF $EXTRACT(IOST)="C"
- WRITE !
- FOR I=1:1:4
- WRITE !,PSXTXT(I,0)
- IF I=4
- HANG 3
- +14 KILL PSXTXT,DIRHOLD
- +15 QUIT
- EXIT ;
- +1 KILL BATIDB,BATIDM,BHS,BTS,DLM,DODORD,END,FHS,FNAME,G,GBL,I,J,JJ,LL,LINE,LMSGLOC
- +2 KILL LN,LNCNT,LNNUM,LSEG,M,MCNT,MSH,NTE1,NTE2,NTE3,NTE4,NTE7,ORC,ORDCNT,ORDCNTB
- +3 KILL P,P1,P2,P3,PATH,PI,PID,PNAME,PSXERR,PSXTXT,PTCNT,PTCNTB,REC,RX1,RXE,RXID1,RXIDC,RXIDE
- +4 KILL S,S1,S2,S3,SEG,SEGSEQ,SEPS,STR,STR0,V,VALUE,XM,XX,Y,YY,ZR1,ZX1
- +5 KILL ADDRESS,BATDTM,BATID,BATIDB,BATIDM,BATNM,DIVISION,DIVNM,DIVNUM,EXPDT,FACNM,FNAME2,FNAME3,ISSDT
- +6 KILL LSTRFLDT,MAILID,NTE1ADD,NTE1DIV,NTE1LOC,PID0,PIECE,PRVPHY,PSXF,RFLDT,RXCNT,RXDATES,RXNUM,RXZNUM
- +7 KILL SIG,SITEID,START,TRANDTS,XMZ
- +8 KILL ^TMP($JOB,"PSXDOD"),PSXTXT
- +9 QUIT
- LOADTMP ; load data into ^TMP
- +1 KILL ^TMP($JOB,"PSXDOD")
- +2 FOR I=1:1
- SET X=$GET(^XMB(3.9,125829,2,I,0))
- if X=""
- QUIT
- SET ^TMP($JOB,"PSXDOD",I)=X
- +3 QUIT
- CLEARFLS(XX,EXT) ;
- LOOP KILL PSXF,PSXL
- +1 SET PATH=$$GET1^DIQ(554,1,XX)
- SET PSXF(EXT)=""
- +2 SET Y=$$LIST^%ZISH(PATH,"PSXF","PSXL")
- +3 WRITE !,"path ",PATH,!,"files ",EXT
- +4 if $DATA(PSXL)'>1
- QUIT
- +5 SET FILE=""
- FOR I=0:0
- SET FILE=$ORDER(PSXL(FILE))
- if FILE=""
- QUIT
- WRITE !,FILE
- SET I=I+1
- +6 if I'>0
- QUIT
- +7 KILL DIR
- SET DIR(0)="Y"
- SET DIR("A")="DELETE FILES ?? "
- SET DIR("B")="N"
- DO ^DIR
- KILL DIR
- if Y'>0
- QUIT
- +8 WRITE $$DEL^%ZISH(PATH,"PSXL")
- +9 GOTO LOOP
- +10 QUIT