PSXDODH ;BIR/HTW-HL7 Message Conversion ;01/15/02 13:10:52
 ;;2.0;CMOP;**38**;11 Apr 97
 ;  Convert CMOP transmission messages from HL7 V 2.3.1 to V 2.1
START ;  Create 2.1 format 
EN(PATH,FNAME) ; needs directory & file name
 ; force an error in the next line
 ;S X=ERROR ; generate an undefined error 
 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=""
 S G="^TMP($J,""PSXDOD"")" ; for global indirection
 ; Perform Patient Safety check and gather a few variables
 D BLDSEQ^PSXDODH1,TESTBT^PSXDODH1
 ;send acknowledgement message
 K ACK
 S ACK="MSH|^~\&|VistA||CHCS||20010925202704||ORM^O02|573-013240530|P|2.3.1|||NE|NE"
 S BATID=BATIDB,PIECE(BHS,"|",11)=BATID
 D NOW^%DTC S BATDTM=+$$HLDATE^HLFNC(%)
 F YY="BATID^10","BATDTM^7" D PUT(.ACK,"|",YY)
 S ACK(1)=ACK,ACK(2)="MSA|CR|"_BATID
 I PSXERR'="" S ACK(2)=ACK(2)_"|"_PSXERR
 S FNAME2=$P(FNAME,".",1)_".TAC",PATH=$$GET1^DIQ(554,1,21)
 I PSXERR'="" D
 . F XX=1:1:5 S Y=$$GTF^%ZISH("ACK(1)",1,PATH,FNAME2) Q:Y=1  H 4
 . I Y'=1 D FALERT^PSXDODH1(FNAME2,PATH)
 . S PATH=$$GET1^DIQ(554,1,22)
 . F XX=1:1:5 S Y=$$GTF^%ZISH("ACK(1)",1,PATH,FNAME2) Q:Y=1  H 4
 . I Y'=1 D FALERT^PSXDODH1(FNAME2,PATH)
 . ;****TESTING
 I PSXERR'="" G ERRMSG
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 "_FACNUM_"-"_BATNM_" from "_FACNM,XMDUZ=.5
XMZ D XMZ^XMA2
 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(@G@(LNNUM)) Q:LNNUM'>0  S LN=@G@(LNNUM),SEG=$P(LN,"|") S:SEG["NTE" SEG=$P(LN,"|",1,2) D
 . I "NTE|2,NTE|3,NTE|4"[SEG D NTE234
 . I SEG="MSH" D MSH
 . I SEG="PID" D PID
 . I SEG="ORC" D ORC
 . I SEG="RXE" D RXE
 . I SEG="NTE|7" K NTE7 S NTE7=LN
 . I SEG="ZR1" D ZR1,BUILD,SETRX
 . I SEG="BTS" D BTS
 S ^XMB(3.9,XMZ,2,0)="^^"_MCNT_U_MCNT_U_DT
 S XMY("S.PSXX CMOP SERVER")=""
 ;S XMY(DUZ)="" ;****TESTING
 D ENT1^XMD
 D EXIT
 Q
MSH ;assemble $$MSG, MSH
 ;MSH|^~\&|CHCS||VistA||20020219144700||ORM^O01|0124-020501408-1|P|2.3.
 D NTE234CK
 S DODORD=$P(LN,"|",10),DODORD=$P(DODORD,"-",3)
 S ORDCNT=ORDCNT+1
 S MCNT=MCNT+1,@M@(MCNT,0)="$MSG^"_ORDCNT ; Set current order $MSG order value
 I LMSGLOC S $P(@M@(LMSGLOC,0),"^",3)=MCNT-LMSGLOC ; Set last $MSG's location value of line count
 S LMSGLOC=MCNT ; store current $MSGs location
 S MSH="MSH|^~\&|CHCS||VistA||20020219144700||ORM|0124-020501408-1|P|2.1|" ;****Testing
 S $P(MSH,7,"|")=$P(LN,"|",7),$P(MSH,"|",10)=ORDCNT
 S MCNT=MCNT+1,@M@(MCNT,0)=MSH
 Q
PID ;
 ;"PID|||98374511^3^M11||DUCK^CONSTANCE SUSAN||||||1804 MAUMPHREY LANE E.^^HIRANDO^CA^36662||2059880101"
 S PID0=$P(LN,"PID|",2)
 F YY="PTID^3","PNAME^5","PADD^11","PHONE^13" D PIECE(PID0,"|",YY)
 S PT1ST=$P(PNAME,"^",3,99),PTLST=$P(PNAME,"^",1,2) ; VENDOR ADJUSTMENT (REMOVE "^")
 S PT1ST=$TR(PT1ST,"^"," "),PNAME=PTLST_"^"_PT1ST ; VENDOR ADJUSTMENT (REMOVE "^")
 K PT1ST,PTLST ; VENDOR ADJUSTMENT (REMOVE "^")
 S PNAME=$P(PNAME,"^",2,99) ; remove leading "^"
 S PID="" F YY="PTID^3","PNAME^5","PADD^11","PHONE^13" D PUT(.PID,"|",YY)
 S PID="PID|"_PID
 S MCNT=MCNT+1,@M@(MCNT,0)=PID
 Q
 ;
ORC ;Patient Data from ORC and RXE(2.3.1) parse date pieces for RX1,ZX1
 ; element mapping contained in document HL7 2.1_2.3 CONVERSION.xls
 ;S NODE="ORC|NM|0124-NA1281-2||2^1|||^^^20020213^20020315|||25||^HENDERSON^DIANE|||20020213000000||||||||"
 K RX1,ZX1
 S ORC=$P(LN,"ORC|",2) ; adjust line for HL7 component counting
 F YY="RXINDX^2","RXCNT^4","RXDATES^7","PRVPHY^12","ISSDT^15" D PIECE(ORC,"|",YY)
 S RFLDT=$P(RXDATES,"^",4),EXPDT=$P(RXDATES,"^",5)
 S MCNT=MCNT+1,@M@(MCNT,0)="ORC|NW|"
 Q
RXE ;  Start building RX1.  RX1 has data elements from ORC and RXE segments from 3.2.1  
 ;S RXE="RXE|100|A0259^AMOXICILLIN 250MG CAP^L|100||CAP||^TAKE ONE FOUR TIMES A DAY AS DIRECTED THEN TAKE 10 THREE TIMES A DAY AS DIRECTE|||||10||25|NA1281|9||20020213151053"
 S RXE=$P(LN,"RXE|",2)
 F YY="QTY^1","DRUGID^2","SIG^7","NUMRFLS^12","VERPHRM^14","RXNUM^15","RFLRMN^16","LSTRFLDT^18" D PIECE(RXE,"|",YY)
 S RXNUM=$P(RXNUM,"-",2)
 S ISSDT=$$FMDATE^HLFNC(ISSDT)\1,ISSDT=$$HLDATE^HLFNC(ISSDT) ;strip off time
 S LSTRFLDT=$$FMDATE^HLFNC(LSTRFLDT)\1,LSTRFLDT=$$HLDATE^HLFNC(LSTRFLDT)
 S SIG=$E(SIG,2,200)
 Q
ZR1 ;
 ;S NODE="ZR1|NA1281|ONSC|1||1|(2of10)|CMOP TEST PHARMACY|30|RXNA1281|||20030213000000|"
 S ZR1=$P(LN,"ZR1|",2)
 F YY="RXZNUM^1","PATSTAT^2","RNWTYP^3","COPAYID^4","SAFCAP^5","RFLTXT^6","CLNIC^7","DAYSUP^8" D PIECE(ZR1,"|",YY)
 F YY="BARCODE^9","WARNFLG^10","RGSTMAIL^11" D PIECE(ZR1,"|",YY)
 S MAILID="M",RXCNT=$P(RXCNT,"~",1),PRVPHY=$$FMNAME^HLFNC(PRVPHY,"^")
 S LL=$F(PRVPHY," "),$E(PRVPHY,LL-1)="," ;change provider name to FM format "last,first mi jr"
 S RXZNUM=$P(RXZNUM,"-",2),SITEID=DIVNUM_"^"_DIVNM
 Q
BTS ; FINISH
 S MCNT=MCNT+1
 I LMSGLOC S $P(@M@(LMSGLOC,0),"^",3)=MCNT-LMSGLOC
 S END="$$ENDXMIT^^"_DIVNUM_U_BATNM_U_PTCNTB_U_ORDCNTB
 ;S END=$$SETELM^PSXDODH1(END,3,"^",693) ;****TESTING
 ;S END=$$SETELM^PSXDODH1(END,"4,1","^,-",693) ;****TESTING
 S @M@(MCNT,0)=END
 Q
BUILD ; assemble RX1 & ZX1
 ;RX1|NA1367|||||||||||60||P0151^PROPRANOLOL HCL 10MG TAB^L|||||3|20020402|2|||20020502|20020226|0124-NA1367-2||||TAKE ONE TABLET TWICE A DAY
 ;ZX1|NA1367|0124^BALBOA|M|1^1|(2of3)|GORDON ,TEVE||20|20020402||1|1|30||RXNA1367||ONSC|BALBOA
 ; gather elements from subscripted segment array and assemble the segment
 S RXINDX="1"_RXINDX ;****Institution file change for site leading 0s
 S RX1=""
 F YY="RXINDX^1","QTY^12","DRUGID^14","NUMRFLS^19","ISSDT^20","RFLRMN^21","EXPDT^24","LSTRFLDT^25","RXNUM^26","SIG^30" D PUT(.RX1,"|",YY)
 S RX1="RX1|"_RX1
 S ZX1=""
 S RXCNT=$P(RXCNT,"^",2)
 F YY="RXZNUM^1","SITEID^2","MAILID^3","RXCNT^4","RFLTXT^5","PRVPHY^6","RGSTMAIL^7","VERPHRM^8","RFLDT^9" D PUT(.ZX1,"|",YY)
 F YY="COPAYID^10","RNWTYP^11","SAFCAP^12","DAYSUP^13","BARCODE^15","WARNFLG^16","PATSTAT^17","CLNIC^18" D PUT(.ZX1,"|",YY)
 S ZX1="ZX1|"_ZX1
 ; change site number for testing
 ;S RX1=$$SETELM^PSXDODH1(RX1,"2,1","|,-",693) ;****TESTING
 ;S ZX1=$$SETELM^PSXDODH1(ZX1,"3,1","|,^",693) ;****TESTING
 Q
SETRX ;put RX1,ZX1,NTE7 into mail message
 S MCNT=MCNT+1,@M@(MCNT,0)=RX1
 I $L($G(NTE7)) S MCNT=MCNT+1,@M@(MCNT,0)=NTE7 K NTE7
 S MCNT=MCNT+1,@M@(MCNT,0)=ZX1
 Q
NTE234 ; insure 2 3 4 sequence is in place
 I SEG="NTE|2" S MCNT=MCNT+1,@M@(MCNT,0)=LN,NTE2=1
 I SEG="NTE|3" D  S MCNT=MCNT+1,@M@(MCNT,0)=LN,NTE3=1
 . I '$G(NTE2) S MCNT=MCNT+1,@M@(MCNT,0)="NTE|2||",NTE2=1
 I SEG="NTE|4" D  S MCNT=MCNT+1,@M@(MCNT,0)=LN,NTE4=1
 . I '$G(NTE2) S MCNT=MCNT+1,@M@(MCNT,0)="NTE|2||",NTE2=1
 . I '$G(NTE3) S MCNT=MCNT+1,@M@(MCNT,0)="NTE|3||",NTE3=1
 Q
NTE234CK ; encounter MSH , insure NTE 2,3,4 in place
 I '$G(NTE2) S MCNT=MCNT+1,@M@(MCNT,0)="NTE|2||",NTE2=1
 I '$G(NTE3) S MCNT=MCNT+1,@M@(MCNT,0)="NTE|3||",NTE3=1
 I '$G(NTE4) S MCNT=MCNT+1,@M@(MCNT,0)="NTE|4||",NTE4=1
 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 Safety "_FNAME
 S XMY("G.PSXX CMOP MANAGERS")=""
 ;S XMY(DUZ)="" ;***TESTING
 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[HPSXDODH   9671     printed  Sep 23, 2025@19:20:03                                                                                                                                                                                                     Page 2
PSXDODH   ;BIR/HTW-HL7 Message Conversion ;01/15/02 13:10:52
 +1       ;;2.0;CMOP;**38**;11 Apr 97
 +2       ;  Convert CMOP transmission messages from HL7 V 2.3.1 to V 2.1
START     ;  Create 2.1 format 
EN(PATH,FNAME) ; needs directory & file name
 +1       ; force an error in the next line
 +2       ;S X=ERROR ; generate an undefined error 
 +3        IF $LENGTH(PATH)
               IF $LENGTH(FNAME)
                   IF 1
 +4       IF '$TEST
               SET PSXERR="0^BAD PATH OR FILENAME"
               GOTO ERRMSG
 +5        KILL ^TMP($JOB,"PSXDOD")
 +6        SET GBL="^TMP("_$JOB_",""PSXDOD"",1)"
 +7        SET Y=$$FTG^%ZISH(PATH,FNAME,GBL,3)
 +8        IF Y'>0
               SET PSXERR="9^"_PATH_U_FNAME_U_" DID NOT LOAD"
               GOTO ERRMSG
 +9        IF $DATA(^TMP($JOB,"PSXDOD"))'>1
               SET PSXERR="9^"_PATH_U_FNAME_U_" DID NOT LOAD"
               GOTO ERRMSG
EN1       ;
 +1        SET PSXERR=""
 +2       ; for global indirection
           SET G="^TMP($J,""PSXDOD"")"
 +3       ; Perform Patient Safety check and gather a few variables
 +4        DO BLDSEQ^PSXDODH1
           DO TESTBT^PSXDODH1
 +5       ;send acknowledgement message
 +6        KILL ACK
 +7        SET ACK="MSH|^~\&|VistA||CHCS||20010925202704||ORM^O02|573-013240530|P|2.3.1|||NE|NE"
 +8        SET BATID=BATIDB
           SET PIECE(BHS,"|",11)=BATID
 +9        DO NOW^%DTC
           SET BATDTM=+$$HLDATE^HLFNC(%)
 +10       FOR YY="BATID^10","BATDTM^7"
               DO PUT(.ACK,"|",YY)
 +11       SET ACK(1)=ACK
           SET ACK(2)="MSA|CR|"_BATID
 +12       IF PSXERR'=""
               SET ACK(2)=ACK(2)_"|"_PSXERR
 +13       SET FNAME2=$PIECE(FNAME,".",1)_".TAC"
           SET PATH=$$GET1^DIQ(554,1,21)
 +14       IF PSXERR'=""
               Begin DoDot:1
 +15               FOR XX=1:1:5
                       SET Y=$$GTF^%ZISH("ACK(1)",1,PATH,FNAME2)
                       if Y=1
                           QUIT 
                       HANG 4
 +16               IF Y'=1
                       DO FALERT^PSXDODH1(FNAME2,PATH)
 +17               SET PATH=$$GET1^DIQ(554,1,22)
 +18               FOR XX=1:1:5
                       SET Y=$$GTF^%ZISH("ACK(1)",1,PATH,FNAME2)
                       if Y=1
                           QUIT 
                       HANG 4
 +19               IF Y'=1
                       DO FALERT^PSXDODH1(FNAME2,PATH)
 +20      ;****TESTING
               End DoDot:1
 +21       IF PSXERR'=""
               GOTO ERRMSG
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       ; build $$XMIT & NTE|1 and set into Message    
           DO HEADER^PSXDODH1
 +3        SET XMSUB="DOD CMOP "_FACNUM_"-"_BATNM_" from "_FACNM
           SET XMDUZ=.5
XMZ        DO XMZ^XMA2
 +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(@G@(LNNUM))
               if LNNUM'>0
                   QUIT 
               SET LN=@G@(LNNUM)
               SET SEG=$PIECE(LN,"|")
               if SEG["NTE"
                   SET SEG=$PIECE(LN,"|",1,2)
               Begin DoDot:1
 +5                IF "NTE|2,NTE|3,NTE|4"[SEG
                       DO NTE234
 +6                IF SEG="MSH"
                       DO MSH
 +7                IF SEG="PID"
                       DO PID
 +8                IF SEG="ORC"
                       DO ORC
 +9                IF SEG="RXE"
                       DO RXE
 +10               IF SEG="NTE|7"
                       KILL NTE7
                       SET NTE7=LN
 +11               IF SEG="ZR1"
                       DO ZR1
                       DO BUILD
                       DO SETRX
 +12               IF SEG="BTS"
                       DO BTS
               End DoDot:1
 +13       SET ^XMB(3.9,XMZ,2,0)="^^"_MCNT_U_MCNT_U_DT
 +14       SET XMY("S.PSXX CMOP SERVER")=""
 +15      ;S XMY(DUZ)="" ;****TESTING
 +16       DO ENT1^XMD
 +17       DO EXIT
 +18       QUIT 
MSH       ;assemble $$MSG, MSH
 +1       ;MSH|^~\&|CHCS||VistA||20020219144700||ORM^O01|0124-020501408-1|P|2.3.
 +2        DO NTE234CK
 +3        SET DODORD=$PIECE(LN,"|",10)
           SET DODORD=$PIECE(DODORD,"-",3)
 +4        SET ORDCNT=ORDCNT+1
 +5       ; Set current order $MSG order value
           SET MCNT=MCNT+1
           SET @M@(MCNT,0)="$MSG^"_ORDCNT
 +6       ; Set last $MSG's location value of line count
           IF LMSGLOC
               SET $PIECE(@M@(LMSGLOC,0),"^",3)=MCNT-LMSGLOC
 +7       ; store current $MSGs location
           SET LMSGLOC=MCNT
 +8       ;****Testing
           SET MSH="MSH|^~\&|CHCS||VistA||20020219144700||ORM|0124-020501408-1|P|2.1|"
 +9        SET $PIECE(MSH,7,"|")=$PIECE(LN,"|",7)
           SET $PIECE(MSH,"|",10)=ORDCNT
 +10       SET MCNT=MCNT+1
           SET @M@(MCNT,0)=MSH
 +11       QUIT 
PID       ;
 +1       ;"PID|||98374511^3^M11||DUCK^CONSTANCE SUSAN||||||1804 MAUMPHREY LANE E.^^HIRANDO^CA^36662||2059880101"
 +2        SET PID0=$PIECE(LN,"PID|",2)
 +3        FOR YY="PTID^3","PNAME^5","PADD^11","PHONE^13"
               DO PIECE(PID0,"|",YY)
 +4       ; VENDOR ADJUSTMENT (REMOVE "^")
           SET PT1ST=$PIECE(PNAME,"^",3,99)
           SET PTLST=$PIECE(PNAME,"^",1,2)
 +5       ; VENDOR ADJUSTMENT (REMOVE "^")
           SET PT1ST=$TRANSLATE(PT1ST,"^"," ")
           SET PNAME=PTLST_"^"_PT1ST
 +6       ; VENDOR ADJUSTMENT (REMOVE "^")
           KILL PT1ST,PTLST
 +7       ; remove leading "^"
           SET PNAME=$PIECE(PNAME,"^",2,99)
 +8        SET PID=""
           FOR YY="PTID^3","PNAME^5","PADD^11","PHONE^13"
               DO PUT(.PID,"|",YY)
 +9        SET PID="PID|"_PID
 +10       SET MCNT=MCNT+1
           SET @M@(MCNT,0)=PID
 +11       QUIT 
 +12      ;
ORC       ;Patient Data from ORC and RXE(2.3.1) parse date pieces for RX1,ZX1
 +1       ; element mapping contained in document HL7 2.1_2.3 CONVERSION.xls
 +2       ;S NODE="ORC|NM|0124-NA1281-2||2^1|||^^^20020213^20020315|||25||^HENDERSON^DIANE|||20020213000000||||||||"
 +3        KILL RX1,ZX1
 +4       ; adjust line for HL7 component counting
           SET ORC=$PIECE(LN,"ORC|",2)
 +5        FOR YY="RXINDX^2","RXCNT^4","RXDATES^7","PRVPHY^12","ISSDT^15"
               DO PIECE(ORC,"|",YY)
 +6        SET RFLDT=$PIECE(RXDATES,"^",4)
           SET EXPDT=$PIECE(RXDATES,"^",5)
 +7        SET MCNT=MCNT+1
           SET @M@(MCNT,0)="ORC|NW|"
 +8        QUIT 
RXE       ;  Start building RX1.  RX1 has data elements from ORC and RXE segments from 3.2.1  
 +1       ;S RXE="RXE|100|A0259^AMOXICILLIN 250MG CAP^L|100||CAP||^TAKE ONE FOUR TIMES A DAY AS DIRECTED THEN TAKE 10 THREE TIMES A DAY AS DIRECTE|||||10||25|NA1281|9||20020213151053"
 +2        SET RXE=$PIECE(LN,"RXE|",2)
 +3        FOR YY="QTY^1","DRUGID^2","SIG^7","NUMRFLS^12","VERPHRM^14","RXNUM^15","RFLRMN^16","LSTRFLDT^18"
               DO PIECE(RXE,"|",YY)
 +4        SET RXNUM=$PIECE(RXNUM,"-",2)
 +5       ;strip off time
           SET ISSDT=$$FMDATE^HLFNC(ISSDT)\1
           SET ISSDT=$$HLDATE^HLFNC(ISSDT)
 +6        SET LSTRFLDT=$$FMDATE^HLFNC(LSTRFLDT)\1
           SET LSTRFLDT=$$HLDATE^HLFNC(LSTRFLDT)
 +7        SET SIG=$EXTRACT(SIG,2,200)
 +8        QUIT 
ZR1       ;
 +1       ;S NODE="ZR1|NA1281|ONSC|1||1|(2of10)|CMOP TEST PHARMACY|30|RXNA1281|||20030213000000|"
 +2        SET ZR1=$PIECE(LN,"ZR1|",2)
 +3        FOR YY="RXZNUM^1","PATSTAT^2","RNWTYP^3","COPAYID^4","SAFCAP^5","RFLTXT^6","CLNIC^7","DAYSUP^8"
               DO PIECE(ZR1,"|",YY)
 +4        FOR YY="BARCODE^9","WARNFLG^10","RGSTMAIL^11"
               DO PIECE(ZR1,"|",YY)
 +5        SET MAILID="M"
           SET RXCNT=$PIECE(RXCNT,"~",1)
           SET PRVPHY=$$FMNAME^HLFNC(PRVPHY,"^")
 +6       ;change provider name to FM format "last,first mi jr"
           SET LL=$FIND(PRVPHY," ")
           SET $EXTRACT(PRVPHY,LL-1)=","
 +7        SET RXZNUM=$PIECE(RXZNUM,"-",2)
           SET SITEID=DIVNUM_"^"_DIVNM
 +8        QUIT 
BTS       ; FINISH
 +1        SET MCNT=MCNT+1
 +2        IF LMSGLOC
               SET $PIECE(@M@(LMSGLOC,0),"^",3)=MCNT-LMSGLOC
 +3        SET END="$$ENDXMIT^^"_DIVNUM_U_BATNM_U_PTCNTB_U_ORDCNTB
 +4       ;S END=$$SETELM^PSXDODH1(END,3,"^",693) ;****TESTING
 +5       ;S END=$$SETELM^PSXDODH1(END,"4,1","^,-",693) ;****TESTING
 +6        SET @M@(MCNT,0)=END
 +7        QUIT 
BUILD     ; assemble RX1 & ZX1
 +1       ;RX1|NA1367|||||||||||60||P0151^PROPRANOLOL HCL 10MG TAB^L|||||3|20020402|2|||20020502|20020226|0124-NA1367-2||||TAKE ONE TABLET TWICE A DAY
 +2       ;ZX1|NA1367|0124^BALBOA|M|1^1|(2of3)|GORDON ,TEVE||20|20020402||1|1|30||RXNA1367||ONSC|BALBOA
 +3       ; gather elements from subscripted segment array and assemble the segment
 +4       ;****Institution file change for site leading 0s
           SET RXINDX="1"_RXINDX
 +5        SET RX1=""
 +6        FOR YY="RXINDX^1","QTY^12","DRUGID^14","NUMRFLS^19","ISSDT^20","RFLRMN^21","EXPDT^24","LSTRFLDT^25","RXNUM^26","SIG^30"
               DO PUT(.RX1,"|",YY)
 +7        SET RX1="RX1|"_RX1
 +8        SET ZX1=""
 +9        SET RXCNT=$PIECE(RXCNT,"^",2)
 +10       FOR YY="RXZNUM^1","SITEID^2","MAILID^3","RXCNT^4","RFLTXT^5","PRVPHY^6","RGSTMAIL^7","VERPHRM^8","RFLDT^9"
               DO PUT(.ZX1,"|",YY)
 +11       FOR YY="COPAYID^10","RNWTYP^11","SAFCAP^12","DAYSUP^13","BARCODE^15","WARNFLG^16","PATSTAT^17","CLNIC^18"
               DO PUT(.ZX1,"|",YY)
 +12       SET ZX1="ZX1|"_ZX1
 +13      ; change site number for testing
 +14      ;S RX1=$$SETELM^PSXDODH1(RX1,"2,1","|,-",693) ;****TESTING
 +15      ;S ZX1=$$SETELM^PSXDODH1(ZX1,"3,1","|,^",693) ;****TESTING
 +16       QUIT 
SETRX     ;put RX1,ZX1,NTE7 into mail message
 +1        SET MCNT=MCNT+1
           SET @M@(MCNT,0)=RX1
 +2        IF $LENGTH($GET(NTE7))
               SET MCNT=MCNT+1
               SET @M@(MCNT,0)=NTE7
               KILL NTE7
 +3        SET MCNT=MCNT+1
           SET @M@(MCNT,0)=ZX1
 +4        QUIT 
NTE234    ; insure 2 3 4 sequence is in place
 +1        IF SEG="NTE|2"
               SET MCNT=MCNT+1
               SET @M@(MCNT,0)=LN
               SET NTE2=1
 +2        IF SEG="NTE|3"
               Begin DoDot:1
 +3                IF '$GET(NTE2)
                       SET MCNT=MCNT+1
                       SET @M@(MCNT,0)="NTE|2||"
                       SET NTE2=1
               End DoDot:1
               SET MCNT=MCNT+1
               SET @M@(MCNT,0)=LN
               SET NTE3=1
 +4        IF SEG="NTE|4"
               Begin DoDot:1
 +5                IF '$GET(NTE2)
                       SET MCNT=MCNT+1
                       SET @M@(MCNT,0)="NTE|2||"
                       SET NTE2=1
 +6                IF '$GET(NTE3)
                       SET MCNT=MCNT+1
                       SET @M@(MCNT,0)="NTE|3||"
                       SET NTE3=1
               End DoDot:1
               SET MCNT=MCNT+1
               SET @M@(MCNT,0)=LN
               SET NTE4=1
 +7        QUIT 
NTE234CK  ; encounter MSH , insure NTE 2,3,4 in place
 +1        IF '$GET(NTE2)
               SET MCNT=MCNT+1
               SET @M@(MCNT,0)="NTE|2||"
               SET NTE2=1
 +2        IF '$GET(NTE3)
               SET MCNT=MCNT+1
               SET @M@(MCNT,0)="NTE|3||"
               SET NTE3=1
 +3        IF '$GET(NTE4)
               SET MCNT=MCNT+1
               SET @M@(MCNT,0)="NTE|4||"
               SET NTE4=1
 +4        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 Safety "_FNAME
 +5        SET XMY("G.PSXX CMOP MANAGERS")=""
 +6       ;S XMY(DUZ)="" ;***TESTING
 +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