PSOHLDS2 ;BHAM ISC/PWC,SAB-Build HL7 Segments for automated interface ;11/22/06 3:24pm
 ;;7.0;OUTPATIENT PHARMACY;**156,198,255,200,268,305,336,434,282,531,524**;DEC 1997;Build 28
 ;DIWP supported by DBIA 10011
 ;^PS(50.606 supported by DBIA 2174
 ;^PS(50.7 supported by DBIA #2223
 ;^PS(51 supported by DBIA 2224
 ;^PS(51.2 supported by DBIA 2226
 ;^PS(55 supported by DBIA 2228
 ;^PSDRUG supported by DBIA 221
 ;^PS(54 supported by DBIA 2227
 ;Cont'd build HL7 segments
 ;
 ;*198 add check to insert spaces into PMI segments
 ;*255 add 2 new fields to RXE.21 (label name & VA PRINT NAME)
 ;     and move NTEPMI tag to PSOHLDS4
 ;*305 send  Notice of Privacy Practices in NTE9 - Modified to NTE9 as NTE8 already exist
 ;*524 add ZZZ segment for HAZ info to OPAI
 ;
RXE(PSI) ;pharmacy encoded order segment
 Q:'$D(DFN)  N RXE S RXE="" S $P(RXE,"|",1)=""""""
 S $P(RXE,"|",2)=$S($P($G(^PSDRUG(IDGN,"ND")),"^",10)'="":$P(^("ND"),"^",10),($G(PSND1)&$G(PSND3)):$P($G(PSOXN2),"^",2),1:"""""")_CS_$G(PSND2)_CS_"99PSNDF"_CS_PSND1_"."_PSND3_"."_$G(IDGN)_CS_$P($G(^PSDRUG(IDGN,0)),"^")_CS_"99PSD"
 S $P(RXE,"|",3)="" I $G(PSOXN)="" S PSOXN=""""""
 S $P(RXE,"|",5)=PSOXN_CS_$S($G(UNIT)'="":$G(UNIT),1:"""""")_CS_"99PSU"
 S POIPTR=$P($G(^PSRX(IRXN,"OR1")),"^") I POIPTR S PODOSE=$P($G(^PS(50.7,POIPTR,0)),"^",2),PODOSENM=$P($G(^PS(50.606,PODOSE,0)),"^")
 I '$G(POIPTR) S PODOSE=$P($G(^PS(50.7,$P($G(^PSDRUG(IDGN,2)),"^"),0)),"^",2),PODOSENM=$P($G(^PS(50.606,PODOSE,0)),"^")
 S TRADENM=$G(^PSRX(IRXN,"TN")),$P(RXE,"|",6)=PODOSE_CS_PODOSENM_CS_"99PSF"
 S $P(RXE,"|",8)=MP,$P(RXE,"|",9)=TRADENM,$P(RXE,"|",10)=QTY
 S $P(RXE,"|",11)=CS_$P($G(^PSDRUG(IDGN,660)),"^",8),$P(RXE,"|",12)=NRFL
 S $P(RXE,"|",13)=DEAID,$P(RXE,"|",14)=VPHARMID_CS_$P(VPHARM,",",1)_CS_$P(VPHARM,",",2)
 S $P(RXE,"|",15)=$P(^PSRX(IRXN,0),"^"),$P(RXE,"|",16)=RFRM,$P(RXE,"|",17)=NFLD
 S $P(RXE,"|",18)=PRIORDT,$P(RXE,"|",31)=CSUB_RS_SCTALK_RS_OTLAN
 S $P(RXE,"|",21)=CS_DRUG_RS_CS_$G(VANAME)                       ;*255
 S ^TMP("PSO",$J,PSI)="RXE|"_RXE,PSI=PSI+1
 K PODOSE,PODOSENM,POIPTR,TRADENM,UU
 Q
RXD(PSI) ;pharmacy dispense segment
 Q:'$D(DFN)  N RXD,I
 S WNS="" I $G(WARN) F I=1:1 S WW=$P(WARN,",",I) Q:WW=""  S WNS=WNS_WW_CS_$S(WW'["N":^PS(54,WW,0),1:"")_RS
 S RXD="RXD"_FS_$S($G(FPN):FPN,1:0)_FS_$S($P($G(^PSDRUG(IDGN,"ND")),"^",10)'="":$P(^("ND"),"^",10),($G(PSND1)&$G(PSND3)):$P($G(PSOXN2),"^",2),1:"""""")_CS_PSND2_CS_"99PSNDF"  ;*531
 S RXD=RXD_CS_PSND1_"."_PSND3_"."_$G(IDGN)_CS_$P($G(^PSDRUG(IDGN,0)),"^")_CS_"99PSD"
 S RXD=RXD_FS_DISPDT_FS_FS_FS_FS_$P(^PSRX(IRXN,0),"^")_FS_NRFL
 S RXD=RXD_FS_DEA_RS_PSONDC_FS_$S(FIN'="":FIN_CS_FIN1,1:"")_FS
 S RXD=RXD_FS_DASPLY_FS_MW_FS_FS_CS_$S($G(CAP):"NON-SAFETY",1:"SAFETY")
 S RXD=RXD_FS_FS_FS_FS_EXDT_FS_FS_FS_FS_FS_FS_WNS_FS_FS
 S ^TMP("PSO",$J,PSI)=RXD,PSI=PSI+1
 Q
RXR(PSI) ;pharmacy route segment
 Q:'$D(DFN)  N RXR S (PSROUTE,RTNAME)=""""""
 F PSRTLP=0:0 S PSRTLP=$O(^PSRX(IRXN,6,PSRTLP)) Q:'PSRTLP  D
 .S PSROUTE=$P($G(^PSRX(IRXN,6,PSRTLP,0)),"^",7)
 .I PSROUTE,$D(^PS(51.2,PSROUTE,0))  S RTNAME=$P(^PS(51.2,PSROUTE,0),"^")
 I RTNAME="" K PSROUTE,RTNAME,PSRTLP Q
 S RXR="RXR"_FS_$G(PSROUTE)_CS_$G(RTNAME)_CS_"99PSR"_FS_FS_FS_FS
 S ^TMP("PSO",$J,PSI)=RXR,PSI=PSI+1
 K PSROUTE,RTNAME,PSRTLP
 Q
SIG K OT S SGY="" F P=1:1:$L(SIG," ") S X=$P(SIG," ",P) D:X]""
 .I $D(^PS(51,"A",X)) D
 ..;PSO*7*282 Intended Use
 ..I $P($G(^PS(55,DFN,"LAN")),"^") S OT=$O(^PS(51,"B",X,0)) I OT,($P(^PS(51,OT,0),"^",4)<2)&($P($G(^PS(51,OT,4)),"^")]"") S X=$P(^PS(51,OT,4),"^") K OT Q
 ..;S %=^PS(51,"A",X),X=$P(%,"^") I $P(%,"^",2)]"" S Y=$P(SIG," ",P-1),Y=$E(Y,$L(Y)) S:Y>1 X=$P(%,"^",2)
 .S SGY=SGY_X_" "
 S X="",SGC=1 F J=1:1 S Z=$P(SGY," ",J) S:Z="" SGY(SGC)=X Q:Z=""  S:$L(X)+$L(Z)'<$S($P(PSOPAR,"^",28):46,1:34) SGY(SGC)=X,SGC=SGC+1,X="" S X=X_Z_" "
SIGOLD I '$P(PSOPAR,"^",28) D  K NHC
 .K DIC,DR,DIQ,NHC S DIC=2,DA=DFN,DR=148,DIQ="NHC",DIQ(0)="I"
 .D EN^DIQ1 K DIC,DR,DIQ
 .I NHC(2,DFN,148,"I")="Y"!($P($G(^PS(55,DFN,40)),"^")) S SGC=SGC+1,SGY(SGC)="Expiration:________ Mfg:_________"
 Q
 ;
PSOLBL3 ;RX must be defined (Internal), Check already done for OERR SIG
 ;Format OERR Sig for New and Old label stock
 N CTCT,FFFF,LLIM,LLLL,LVAR,LVAR1,PPP,PPPP,SGCT,SIG9,ZZZZ,PSLONG,PPPP
 S RX=IRXN
 I $P($G(^PS(55,DFN,"LAN")),"^") N II D OTHL^PSOLBL3 G:$G(FND) FMSIG
 S PSLONG=$S($P(PSOPAR,"^",28):46,1:34)
 ; NEXT LINE IF SIG IS MOVED BACK TO MULTIPLE
 S PPPP=1 F PPP=0:0 S PPP=$O(^PSRX(RX,"SIG1",PPP)) Q:'PPP  I $G(^PSRX(RX,"SIG1",PPP,0))'="" S SIG9(PPPP)=^(0) S PPPP=PPPP+1
 ;NEXT LINE IF 1ST FRONT DOOR SIG LINE LIVES IN BACK DOOR SPOT
FMSIG S (LVAR,LVAR1)="",LLLL=1
 F FFFF=0:0 S FFFF=$O(SIG9(FFFF)) Q:'FFFF  S SGCT=0 F ZZZZ=1:1:$L(SIG9(FFFF)) I $E(SIG9(FFFF),ZZZZ)=" "!($L(SIG9(FFFF))=ZZZZ) S SGCT=SGCT+1 D  I $L(LVAR)>PSLONG S SGY(LLLL)=LLIM_" ",LLLL=LLLL+1,LVAR=LVAR1
 .S LVAR1=$P(SIG9(FFFF)," ",(SGCT)),LLIM=LVAR,LVAR=$S(LVAR="":LVAR1,1:LVAR_" "_LVAR1)
 I $G(LVAR)'="" S SGY(LLLL)=LVAR
 I '$P(PSOPAR,"^",28) S SGC=0 F CTCT=0:0 S CTCT=$O(SGY(CTCT)) Q:'CTCT  S SGC=SGC+1
 I $O(OSGY(0)) D
 .F I=0:0 S I=$O(SGY(I)) Q:'I  I $G(OSGY(I))']"" S OSGY(I)=" "
 .F I=0:0 S I=$O(OSGY(I)) Q:'I  I $G(SGY(I))']"" S SGY(I)=" "
 Q
NTE ;build NTE segment for SIG
 ;
 Q:'$D(DFN)
 ; 1 = SIG
 ; 2 = PI Narrative
 ; 3 = Drug Warning
 ; 4 = Profile
 ; 5 = Drug Interaction
 ; 6 = Drug Allergy
 ; 7 = PMI Sheet (NTEPMI in PSOHLDS4)
 ; 8 = Medication Instructions
 ; 9 = Privacy Notification
 ;
 K FLDX
 D NTE1(.PSI) K FLDX D NTE2(.PSI) K FLDX D NTE3(.PSI) K FLDX
 D NTE4(.PSI) K FLDX D NTE5(.PSI) K FLDX D NTE6(.PSI) K FLDX
 Q
 ;
NTE1(PSI) ;SIG
 S SIG=$P($G(^PSRX(IRXN,"SIG")),"^")
 I $P($G(^PSRX(IRXN,"SIG")),"^",2) D PSOLBL3,SIGOLD
 I '$P($G(^PSRX(IRXN,"SIG")),"^",2) D SIG
 I $O(OSGY(0)) D  G KNTE
 .K DRR F DR=0:0 S DR=$O(SGY(DR)) Q:'DR  S DRR=$G(DRR)+1
 .S DRR=DRR+1,SGY(DRR)=FS_"Medication Instructions (LANGUAGE PREFERENCE)"
 .K DRR F DR=0:0 S DR=$O(OSGY(DR)) Q:'DR  S DRR=$G(DRR)+1
 .S DRR=DRR+1,OSGY(DRR)=FS_"Medication Instructions (ENGLISH)"
 .K DRR S ^TMP("PSO",$J,PSI)="NTE"_FS_1_FS_FS
 .S CLD=1 F DR=0:0 S DR=$O(OSGY(DR)) Q:'DR  D
 ..S:$L($G(^TMP("PSO",$J,PSI,CLD))_OSGY(DR))>245 CLD=CLD+1 S ^TMP("PSO",$J,PSI,CLD)=$G(^TMP("PSO",$J,PSI,CLD))_OSGY(DR)
 .S PSI=PSI+1,^TMP("PSO",$J,PSI)="NTE"_FS_8_FS_FS
 .S CLD=1 F DR=0:0 S DR=$O(SGY(DR)) Q:'DR  D
 ..S:$L($G(^TMP("PSO",$J,PSI,CLD))_SGY(DR))>245 CLD=CLD+1 S ^TMP("PSO",$J,PSI,CLD)=$G(^TMP("PSO",$J,PSI,CLD))_SGY(DR)
 K DRR F DR=0:0 S DR=$O(SGY(DR)) Q:'DR  S DRR=$G(DRR)+1
 S DRR=DRR+1,SGY(DRR)=FS_"Medication Instructions"
 K DRR S ^TMP("PSO",$J,PSI)="NTE"_FS_1_FS_FS
 S CLD=1 F DR=0:0 S DR=$O(SGY(DR)) Q:'DR  D
 .S:$L($G(^TMP("PSO",$J,PSI,CLD))_SGY(DR))>245 CLD=CLD+1 S ^TMP("PSO",$J,PSI,CLD)=$G(^TMP("PSO",$J,PSI,CLD))_SGY(DR)
KNTE S PSI=PSI+1 K DR,CLD,DRR,SIG,E,F,S,FLD1,X,Y,SGY,SGC,Z,DR,%,J,P,NT1,ST,EN,LTH
 Q
LENGTH(NT1) ; compensate for length > 245
 I $L(NT1)>245 S LTH=$E($L(NT1)/245,1) S:$L(NT1)#245>0 LTH=LTH+1 F WW=1:1:LTH D
 . S:WW=1 ST=1,EN=245 S:WW>1 ST=(ST+245),EN=(EN+245) S NT11=$E(NT1,ST,EN)
 . S:WW=1 ^TMP("PSO",$J,PSI)=NT11 S:WW>1 ^TMP("PSO",$J,PSI,WW-1)=NT11
 S:'$D(LTH) ^TMP("PSO",$J,PSI)=NT1 S PSI=PSI+1
 Q
NTE2(PSI) ; Patient Narrative
 K ^UTILITY($J,"W") S (DIWL,PSNACNT)=1,DIWR=45,DIWF="",(PSSIXFL,PSSEVFL)=0 F ZZ=0:0 S ZZ=$O(^PS(59,PSOSITE,6,ZZ)) Q:'ZZ  I $D(^(ZZ,0)) S X=^(0) D ^DIWP
 F LLL=0:0 S LLL=$O(^UTILITY($J,"W",DIWL,LLL)) Q:'LLL  S ^TMP("PSO",$J,PSI,PSNACNT)=^UTILITY($J,"W",DIWL,LLL,0) S PSNACNT=PSNACNT+1,PSSIXFL=1
 I PSSIXFL S ^TMP("PSO",$J,PSI)="NTE"_FS_2_FS_FS,^TMP("PSO",$J,PSI,PSNACNT)=" " S PSNACNT=PSNACNT+1,FLDX=1
 S DIWL=1,DIWR=45,DIWF="" K ^UTILITY($J,"W") F ZZ=0:0 S ZZ=$O(^PS(59,PSOSITE,7,ZZ)) Q:'ZZ  I $D(^(ZZ,0)) S X=^(0) D ^DIWP
 F LLL=0:0 S LLL=$O(^UTILITY($J,"W",DIWL,LLL)) Q:'LLL  S ^TMP("PSO",$J,PSI,PSNACNT)=^UTILITY($J,"W",DIWL,LLL,0) S PSNACNT=PSNACNT+1,PSSEVFL=1
 I PSSEVFL S ^TMP("PSO",$J,PSI,PSNACNT)=" " S PSNACNT=PSNACNT+1
 S DIWL=1,DIWR=45,DIWF="" K ^UTILITY($J,"W") F ZZ=0:0 S ZZ=$O(^PS(59,PSOSITE,4,ZZ)) Q:'ZZ  I $D(^(ZZ,0)) S X=^(0) D ^DIWP
 F LLL=0:0 S LLL=$O(^UTILITY($J,"W",DIWL,LLL)) Q:'LLL  S ^TMP("PSO",$J,PSI,PSNACNT)=^UTILITY($J,"W",DIWL,LLL,0) S PSNACNT=PSNACNT+1
 S:$D(FLDX) ^TMP("PSO",$J,PSI,PSNACNT-1)=^TMP("PSO",$J,PSI,PSNACNT-1)_FS_"Patient Narrative",PSI=PSI+1
 K DIWF,DIWL,DIWR,LLL,PSNACNT,PSSEVFL,PSSIXFL,ZZ
 Q
NTE3(PSI) ;Drug Warning Narrative
 N NTE3,J,TEXT,W,CNT,PSSWSITE
 S WARN=$P($G(^PSDRUG(IDGN,0)),"^",8)
 S PSSWSITE=+$O(^PS(59.7,0))
 I $P($G(^PS(59.7,PSSWSITE,10)),"^",11)="N" D
 .S WARN=$$DRUG^PSSWRNA(IDGN,DFN)
 I WARN="" Q
 S NTE3="NTE"_FS_3_FS_FS,^TMP("PSO",$J,PSI)=NTE3,CNT=1
 F J=1:1 S W=$P(WARN,",",J) Q:W=""  D
 . S:CNT>1 ^TMP("PSO",$J,PSI,CNT-1)=^TMP("PSO",$J,PSI,CNT-1)_"\.sp\"
 . S TEXT=$$WTEXT^PSSWRNA(W,$G(OLAN)) I TEXT'="" S FLDX=1 D
 . . I $L(TEXT)<245 S ^TMP("PSO",$J,PSI,CNT)=TEXT,CNT=CNT+1 Q
 . . N LTH,ST,EN,TXT,WW
 . . S LTH=$E($L(TEXT)/245,1) S:$L(TEXT)#245>0 LTH=LTH+1
 . . F WW=1:1:LTH D
 . . . S:WW=1 ST=1,EN=245 S:WW>1 ST=(ST+245),EN=(EN+245) S TXT=$E(TEXT,ST,EN)
 . . . S ^TMP("PSO",$J,PSI,CNT)=TXT,CNT=CNT+1
 I $G(FLDX) D  S PSI=PSI+1
 . I $L(^TMP("PSO",$J,PSI,CNT-1)_FS_"Drug Warning Narrative")<245 S ^TMP("PSO",$J,PSI,CNT-1)=$G(^TMP("PSO",$J,PSI,CNT-1))_FS_"Drug Warning Narrative"
 . E  S ^TMP("PSO",$J,PSI,CNT)=FS_"Drug Warning Narrative"
 Q
NTE4(PSI) ;Profile information
 S PSODFN=DFN N NTE4
 I $P(PSOPAR,"^",8) D START^PSOHLDS3
 S:$D(NTE4) PSI=PSI+1
 Q
NTE5(PSI) ;Drug Interactions
 N NTE5 D:$D(DRI) START2^PSOHLDS3
 S:$D(NTE5) ^TMP("PSO",$J,PSI)=NTE5_FS_"Drug Interactions",PSI=PSI+1
 Q
NTE6(PSI) ;Drug Allergy Indications
 N NTE6
 Q:'$G(DAW)
 D START3^PSOHLDS3
 Q:NTE6=""
 S ^TMP("PSO",$J,PSI)=NTE6_FS_"Drug Allergy Indications",PSI=PSI+1
 Q
NTE9(PSI) ;Privacy Notification
 N NTE9,PSOLAN
 S NTE9="NTE"_FS_9_FS_FS,^TMP("PSO",$J,PSI)=NTE9
 S PSOLAN=$P($G(^PS(55,DFN,"LAN")),"^",2)
 I PSOLAN'=2 D
 . S ^TMP("PSO",$J,PSI,1)="The VA Notice of Privacy Practices, IB 10-163, which outlines your privacy rights, is available online at http://www1.domain.ext/Health/ or you may obtain a copy by writing the VHA Privacy Office (19F2),"
 . S ^TMP("PSO",$J,PSI,2)="810 Vermont Avenue NW, Washington, DC 20420."_FS_"Privacy Notification"
 I PSOLAN=2 D
 . S ^TMP("PSO",$J,PSI,1)="La Notificacion relacionada con las Politicas de Privacidad del Departamento de Asuntos del Veterano, IB 10-163, contiene los detalles acerca de sus derechos de privacidad y esta disponsible electronicamente"
 . S ^TMP("PSO",$J,PSI,2)=" en la siguiente direccion: http://www1.domain.ext/Health/.  Usted tambien puede conseguir una copia escribiendo a la Oficina de Privacidad del Departamento de Asuntos de Salud del Veterano, (19F2),"
 . S ^TMP("PSO",$J,PSI,3)="810 Vermont Avenue NW, Washington, DC 20420."_FS_"Privacy Notification"
 S PSI=PSI+1
 Q
ZZZ(PSI) ;ZZZ segment for HL7 hazardous text ;*524
 N DRIEN,HAZD,HAZH,VAR
 S DRIEN=$P(^PSRX(IRXN,0),"^",6)
 S VAR=$$HAZ^PSSUTIL(DRIEN)
 S HAZH=$P(VAR,"^",1)
 S HAZH=$S(HAZH:"Y",1:"N")
 S HAZD=$P(VAR,"^",2)
 S HAZD=$S(HAZD:"Y",1:"N")
 S ^TMP("PSO",$J,PSI)="ZZZ"_FS_FS_FS_FS_HAZH_FS_HAZD
 S PSI=PSI+1
 Q
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HPSOHLDS2   11203     printed  Sep 23, 2025@20:06:12                                                                                                                                                                                                   Page 2
PSOHLDS2  ;BHAM ISC/PWC,SAB-Build HL7 Segments for automated interface ;11/22/06 3:24pm
 +1       ;;7.0;OUTPATIENT PHARMACY;**156,198,255,200,268,305,336,434,282,531,524**;DEC 1997;Build 28
 +2       ;DIWP supported by DBIA 10011
 +3       ;^PS(50.606 supported by DBIA 2174
 +4       ;^PS(50.7 supported by DBIA #2223
 +5       ;^PS(51 supported by DBIA 2224
 +6       ;^PS(51.2 supported by DBIA 2226
 +7       ;^PS(55 supported by DBIA 2228
 +8       ;^PSDRUG supported by DBIA 221
 +9       ;^PS(54 supported by DBIA 2227
 +10      ;Cont'd build HL7 segments
 +11      ;
 +12      ;*198 add check to insert spaces into PMI segments
 +13      ;*255 add 2 new fields to RXE.21 (label name & VA PRINT NAME)
 +14      ;     and move NTEPMI tag to PSOHLDS4
 +15      ;*305 send  Notice of Privacy Practices in NTE9 - Modified to NTE9 as NTE8 already exist
 +16      ;*524 add ZZZ segment for HAZ info to OPAI
 +17      ;
RXE(PSI)  ;pharmacy encoded order segment
 +1        if '$DATA(DFN)
               QUIT 
           NEW RXE
           SET RXE=""
           SET $PIECE(RXE,"|",1)=""""""
 +2       SET $PIECE(RXE,"|",2)=$SELECT($PIECE($GET(^PSDRUG(IDGN,"ND")),"^",10)'="":$PIECE(^("ND"),"^",10),($GET(PSND1)&...
           ... $GET(PSND3)):$PIECE($GET(PSOXN2),"^",2),1:"""""")_CS_$GET(PSND2)_CS_"99PSNDF"_CS_PSND1_"."_PSND3_"."_$GET(IDGN)_CS_$PIECE($GET(^PSDRUG(IDGN,0)),"^")_CS_"99PSD"
 +3        SET $PIECE(RXE,"|",3)=""
           IF $GET(PSOXN)=""
               SET PSOXN=""""""
 +4        SET $PIECE(RXE,"|",5)=PSOXN_CS_$SELECT($GET(UNIT)'="":$GET(UNIT),1:"""""")_CS_"99PSU"
 +5        SET POIPTR=$PIECE($GET(^PSRX(IRXN,"OR1")),"^")
           IF POIPTR
               SET PODOSE=$PIECE($GET(^PS(50.7,POIPTR,0)),"^",2)
               SET PODOSENM=$PIECE($GET(^PS(50.606,PODOSE,0)),"^")
 +6        IF '$GET(POIPTR)
               SET PODOSE=$PIECE($GET(^PS(50.7,$PIECE($GET(^PSDRUG(IDGN,2)),"^"),0)),"^",2)
               SET PODOSENM=$PIECE($GET(^PS(50.606,PODOSE,0)),"^")
 +7        SET TRADENM=$GET(^PSRX(IRXN,"TN"))
           SET $PIECE(RXE,"|",6)=PODOSE_CS_PODOSENM_CS_"99PSF"
 +8        SET $PIECE(RXE,"|",8)=MP
           SET $PIECE(RXE,"|",9)=TRADENM
           SET $PIECE(RXE,"|",10)=QTY
 +9        SET $PIECE(RXE,"|",11)=CS_$PIECE($GET(^PSDRUG(IDGN,660)),"^",8)
           SET $PIECE(RXE,"|",12)=NRFL
 +10       SET $PIECE(RXE,"|",13)=DEAID
           SET $PIECE(RXE,"|",14)=VPHARMID_CS_$PIECE(VPHARM,",",1)_CS_$PIECE(VPHARM,",",2)
 +11       SET $PIECE(RXE,"|",15)=$PIECE(^PSRX(IRXN,0),"^")
           SET $PIECE(RXE,"|",16)=RFRM
           SET $PIECE(RXE,"|",17)=NFLD
 +12       SET $PIECE(RXE,"|",18)=PRIORDT
           SET $PIECE(RXE,"|",31)=CSUB_RS_SCTALK_RS_OTLAN
 +13      ;*255
           SET $PIECE(RXE,"|",21)=CS_DRUG_RS_CS_$GET(VANAME)
 +14       SET ^TMP("PSO",$JOB,PSI)="RXE|"_RXE
           SET PSI=PSI+1
 +15       KILL PODOSE,PODOSENM,POIPTR,TRADENM,UU
 +16       QUIT 
RXD(PSI)  ;pharmacy dispense segment
 +1        if '$DATA(DFN)
               QUIT 
           NEW RXD,I
 +2        SET WNS=""
           IF $GET(WARN)
               FOR I=1:1
                   SET WW=$PIECE(WARN,",",I)
                   if WW=""
                       QUIT 
                   SET WNS=WNS_WW_CS_$SELECT(WW'["N":^PS(54,WW,0),1:"")_RS
 +3       ;*531
           SET RXD="RXD"_FS_$SELECT($GET(FPN):FPN,1:0)_FS_$SELECT($PIECE($GET(^PSDRUG(IDGN,"ND")),"^",10)'="":$PIECE(^("ND"),"^",10),($GET(PSND1)&$GET(PSND3)):$PIECE($GET(PSOXN2),"^",2),1:"""""")_CS_PSND2_CS_"99PSNDF"
 +4        SET RXD=RXD_CS_PSND1_"."_PSND3_"."_$GET(IDGN)_CS_$PIECE($GET(^PSDRUG(IDGN,0)),"^")_CS_"99PSD"
 +5        SET RXD=RXD_FS_DISPDT_FS_FS_FS_FS_$PIECE(^PSRX(IRXN,0),"^")_FS_NRFL
 +6        SET RXD=RXD_FS_DEA_RS_PSONDC_FS_$SELECT(FIN'="":FIN_CS_FIN1,1:"")_FS
 +7        SET RXD=RXD_FS_DASPLY_FS_MW_FS_FS_CS_$SELECT($GET(CAP):"NON-SAFETY",1:"SAFETY")
 +8        SET RXD=RXD_FS_FS_FS_FS_EXDT_FS_FS_FS_FS_FS_FS_WNS_FS_FS
 +9        SET ^TMP("PSO",$JOB,PSI)=RXD
           SET PSI=PSI+1
 +10       QUIT 
RXR(PSI)  ;pharmacy route segment
 +1        if '$DATA(DFN)
               QUIT 
           NEW RXR
           SET (PSROUTE,RTNAME)=""""""
 +2        FOR PSRTLP=0:0
               SET PSRTLP=$ORDER(^PSRX(IRXN,6,PSRTLP))
               if 'PSRTLP
                   QUIT 
               Begin DoDot:1
 +3                SET PSROUTE=$PIECE($GET(^PSRX(IRXN,6,PSRTLP,0)),"^",7)
 +4                IF PSROUTE
                       IF $DATA(^PS(51.2,PSROUTE,0))
                           SET RTNAME=$PIECE(^PS(51.2,PSROUTE,0),"^")
               End DoDot:1
 +5        IF RTNAME=""
               KILL PSROUTE,RTNAME,PSRTLP
               QUIT 
 +6        SET RXR="RXR"_FS_$GET(PSROUTE)_CS_$GET(RTNAME)_CS_"99PSR"_FS_FS_FS_FS
 +7        SET ^TMP("PSO",$JOB,PSI)=RXR
           SET PSI=PSI+1
 +8        KILL PSROUTE,RTNAME,PSRTLP
 +9        QUIT 
SIG        KILL OT
           SET SGY=""
           FOR P=1:1:$LENGTH(SIG," ")
               SET X=$PIECE(SIG," ",P)
               if X]""
                   Begin DoDot:1
 +1                    IF $DATA(^PS(51,"A",X))
                           Begin DoDot:2
 +2       ;PSO*7*282 Intended Use
 +3                            IF $PIECE($GET(^PS(55,DFN,"LAN")),"^")
                                   SET OT=$ORDER(^PS(51,"B",X,0))
                                   IF OT
                                       IF ($PIECE(^PS(51,OT,0),"^",4)<2)&($PIECE($GET(^PS(51,OT,4)),"^")]"")
                                           SET X=$PIECE(^PS(51,OT,4),"^")
                                           KILL OT
                                           QUIT 
 +4       ;S %=^PS(51,"A",X),X=$P(%,"^") I $P(%,"^",2)]"" S Y=$P(SIG," ",P-1),Y=$E(Y,$L(Y)) S:Y>1 X=$P(%,"^",2)
                           End DoDot:2
 +5                    SET SGY=SGY_X_" "
                   End DoDot:1
 +6        SET X=""
           SET SGC=1
           FOR J=1:1
               SET Z=$PIECE(SGY," ",J)
               if Z=""
                   SET SGY(SGC)=X
               if Z=""
                   QUIT 
               if $LENGTH(X)+$LENGTH(Z)'<$SELECT($PIECE(PSOPAR,"^",28)
                   SET SGY(SGC)=X
                   SET SGC=SGC+1
                   SET X=""
               SET X=X_Z_" "
SIGOLD     IF '$PIECE(PSOPAR,"^",28)
               Begin DoDot:1
 +1                KILL DIC,DR,DIQ,NHC
                   SET DIC=2
                   SET DA=DFN
                   SET DR=148
                   SET DIQ="NHC"
                   SET DIQ(0)="I"
 +2                DO EN^DIQ1
                   KILL DIC,DR,DIQ
 +3                IF NHC(2,DFN,148,"I")="Y"!($PIECE($GET(^PS(55,DFN,40)),"^"))
                       SET SGC=SGC+1
                       SET SGY(SGC)="Expiration:________ Mfg:_________"
               End DoDot:1
               KILL NHC
 +4        QUIT 
 +5       ;
PSOLBL3   ;RX must be defined (Internal), Check already done for OERR SIG
 +1       ;Format OERR Sig for New and Old label stock
 +2        NEW CTCT,FFFF,LLIM,LLLL,LVAR,LVAR1,PPP,PPPP,SGCT,SIG9,ZZZZ,PSLONG,PPPP
 +3        SET RX=IRXN
 +4        IF $PIECE($GET(^PS(55,DFN,"LAN")),"^")
               NEW II
               DO OTHL^PSOLBL3
               if $GET(FND)
                   GOTO FMSIG
 +5        SET PSLONG=$SELECT($PIECE(PSOPAR,"^",28):46,1:34)
 +6       ; NEXT LINE IF SIG IS MOVED BACK TO MULTIPLE
 +7        SET PPPP=1
           FOR PPP=0:0
               SET PPP=$ORDER(^PSRX(RX,"SIG1",PPP))
               if 'PPP
                   QUIT 
               IF $GET(^PSRX(RX,"SIG1",PPP,0))'=""
                   SET SIG9(PPPP)=^(0)
                   SET PPPP=PPPP+1
 +8       ;NEXT LINE IF 1ST FRONT DOOR SIG LINE LIVES IN BACK DOOR SPOT
FMSIG      SET (LVAR,LVAR1)=""
           SET LLLL=1
 +1        FOR FFFF=0:0
               SET FFFF=$ORDER(SIG9(FFFF))
               if 'FFFF
                   QUIT 
               SET SGCT=0
               FOR ZZZZ=1:1:$LENGTH(SIG9(FFFF))
                   IF $EXTRACT(SIG9(FFFF),ZZZZ)=" "!($LENGTH(SIG9(FFFF))=ZZZZ)
                       SET SGCT=SGCT+1
                       Begin DoDot:1
 +2                        SET LVAR1=$PIECE(SIG9(FFFF)," ",(SGCT))
                           SET LLIM=LVAR
                           SET LVAR=$SELECT(LVAR="":LVAR1,1:LVAR_" "_LVAR1)
                       End DoDot:1
                       IF $LENGTH(LVAR)>PSLONG
                           SET SGY(LLLL)=LLIM_" "
                           SET LLLL=LLLL+1
                           SET LVAR=LVAR1
 +3        IF $GET(LVAR)'=""
               SET SGY(LLLL)=LVAR
 +4        IF '$PIECE(PSOPAR,"^",28)
               SET SGC=0
               FOR CTCT=0:0
                   SET CTCT=$ORDER(SGY(CTCT))
                   if 'CTCT
                       QUIT 
                   SET SGC=SGC+1
 +5        IF $ORDER(OSGY(0))
               Begin DoDot:1
 +6                FOR I=0:0
                       SET I=$ORDER(SGY(I))
                       if 'I
                           QUIT 
                       IF $GET(OSGY(I))']""
                           SET OSGY(I)=" "
 +7                FOR I=0:0
                       SET I=$ORDER(OSGY(I))
                       if 'I
                           QUIT 
                       IF $GET(SGY(I))']""
                           SET SGY(I)=" "
               End DoDot:1
 +8        QUIT 
NTE       ;build NTE segment for SIG
 +1       ;
 +2        if '$DATA(DFN)
               QUIT 
 +3       ; 1 = SIG
 +4       ; 2 = PI Narrative
 +5       ; 3 = Drug Warning
 +6       ; 4 = Profile
 +7       ; 5 = Drug Interaction
 +8       ; 6 = Drug Allergy
 +9       ; 7 = PMI Sheet (NTEPMI in PSOHLDS4)
 +10      ; 8 = Medication Instructions
 +11      ; 9 = Privacy Notification
 +12      ;
 +13       KILL FLDX
 +14       DO NTE1(.PSI)
           KILL FLDX
           DO NTE2(.PSI)
           KILL FLDX
           DO NTE3(.PSI)
           KILL FLDX
 +15       DO NTE4(.PSI)
           KILL FLDX
           DO NTE5(.PSI)
           KILL FLDX
           DO NTE6(.PSI)
           KILL FLDX
 +16       QUIT 
 +17      ;
NTE1(PSI) ;SIG
 +1        SET SIG=$PIECE($GET(^PSRX(IRXN,"SIG")),"^")
 +2        IF $PIECE($GET(^PSRX(IRXN,"SIG")),"^",2)
               DO PSOLBL3
               DO SIGOLD
 +3        IF '$PIECE($GET(^PSRX(IRXN,"SIG")),"^",2)
               DO SIG
 +4        IF $ORDER(OSGY(0))
               Begin DoDot:1
 +5                KILL DRR
                   FOR DR=0:0
                       SET DR=$ORDER(SGY(DR))
                       if 'DR
                           QUIT 
                       SET DRR=$GET(DRR)+1
 +6                SET DRR=DRR+1
                   SET SGY(DRR)=FS_"Medication Instructions (LANGUAGE PREFERENCE)"
 +7                KILL DRR
                   FOR DR=0:0
                       SET DR=$ORDER(OSGY(DR))
                       if 'DR
                           QUIT 
                       SET DRR=$GET(DRR)+1
 +8                SET DRR=DRR+1
                   SET OSGY(DRR)=FS_"Medication Instructions (ENGLISH)"
 +9                KILL DRR
                   SET ^TMP("PSO",$JOB,PSI)="NTE"_FS_1_FS_FS
 +10               SET CLD=1
                   FOR DR=0:0
                       SET DR=$ORDER(OSGY(DR))
                       if 'DR
                           QUIT 
                       Begin DoDot:2
 +11                       if $LENGTH($GET(^TMP("PSO",$JOB,PSI,CLD))_OSGY(DR))>245
                               SET CLD=CLD+1
                           SET ^TMP("PSO",$JOB,PSI,CLD)=$GET(^TMP("PSO",$JOB,PSI,CLD))_OSGY(DR)
                       End DoDot:2
 +12               SET PSI=PSI+1
                   SET ^TMP("PSO",$JOB,PSI)="NTE"_FS_8_FS_FS
 +13               SET CLD=1
                   FOR DR=0:0
                       SET DR=$ORDER(SGY(DR))
                       if 'DR
                           QUIT 
                       Begin DoDot:2
 +14                       if $LENGTH($GET(^TMP("PSO",$JOB,PSI,CLD))_SGY(DR))>245
                               SET CLD=CLD+1
                           SET ^TMP("PSO",$JOB,PSI,CLD)=$GET(^TMP("PSO",$JOB,PSI,CLD))_SGY(DR)
                       End DoDot:2
               End DoDot:1
               GOTO KNTE
 +15       KILL DRR
           FOR DR=0:0
               SET DR=$ORDER(SGY(DR))
               if 'DR
                   QUIT 
               SET DRR=$GET(DRR)+1
 +16       SET DRR=DRR+1
           SET SGY(DRR)=FS_"Medication Instructions"
 +17       KILL DRR
           SET ^TMP("PSO",$JOB,PSI)="NTE"_FS_1_FS_FS
 +18       SET CLD=1
           FOR DR=0:0
               SET DR=$ORDER(SGY(DR))
               if 'DR
                   QUIT 
               Begin DoDot:1
 +19               if $LENGTH($GET(^TMP("PSO",$JOB,PSI,CLD))_SGY(DR))>245
                       SET CLD=CLD+1
                   SET ^TMP("PSO",$JOB,PSI,CLD)=$GET(^TMP("PSO",$JOB,PSI,CLD))_SGY(DR)
               End DoDot:1
KNTE       SET PSI=PSI+1
           KILL DR,CLD,DRR,SIG,E,F,S,FLD1,X,Y,SGY,SGC,Z,DR,%,J,P,NT1,ST,EN,LTH
 +1        QUIT 
LENGTH(NT1) ; compensate for length > 245
 +1        IF $LENGTH(NT1)>245
               SET LTH=$EXTRACT($LENGTH(NT1)/245,1)
               if $LENGTH(NT1)#245>0
                   SET LTH=LTH+1
               FOR WW=1:1:LTH
                   Begin DoDot:1
 +2                    if WW=1
                           SET ST=1
                           SET EN=245
                       if WW>1
                           SET ST=(ST+245)
                           SET EN=(EN+245)
                       SET NT11=$EXTRACT(NT1,ST,EN)
 +3                    if WW=1
                           SET ^TMP("PSO",$JOB,PSI)=NT11
                       if WW>1
                           SET ^TMP("PSO",$JOB,PSI,WW-1)=NT11
                   End DoDot:1
 +4        if '$DATA(LTH)
               SET ^TMP("PSO",$JOB,PSI)=NT1
           SET PSI=PSI+1
 +5        QUIT 
NTE2(PSI) ; Patient Narrative
 +1        KILL ^UTILITY($JOB,"W")
           SET (DIWL,PSNACNT)=1
           SET DIWR=45
           SET DIWF=""
           SET (PSSIXFL,PSSEVFL)=0
           FOR ZZ=0:0
               SET ZZ=$ORDER(^PS(59,PSOSITE,6,ZZ))
               if 'ZZ
                   QUIT 
               IF $DATA(^(ZZ,0))
                   SET X=^(0)
                   DO ^DIWP
 +2        FOR LLL=0:0
               SET LLL=$ORDER(^UTILITY($JOB,"W",DIWL,LLL))
               if 'LLL
                   QUIT 
               SET ^TMP("PSO",$JOB,PSI,PSNACNT)=^UTILITY($JOB,"W",DIWL,LLL,0)
               SET PSNACNT=PSNACNT+1
               SET PSSIXFL=1
 +3        IF PSSIXFL
               SET ^TMP("PSO",$JOB,PSI)="NTE"_FS_2_FS_FS
               SET ^TMP("PSO",$JOB,PSI,PSNACNT)=" "
               SET PSNACNT=PSNACNT+1
               SET FLDX=1
 +4        SET DIWL=1
           SET DIWR=45
           SET DIWF=""
           KILL ^UTILITY($JOB,"W")
           FOR ZZ=0:0
               SET ZZ=$ORDER(^PS(59,PSOSITE,7,ZZ))
               if 'ZZ
                   QUIT 
               IF $DATA(^(ZZ,0))
                   SET X=^(0)
                   DO ^DIWP
 +5        FOR LLL=0:0
               SET LLL=$ORDER(^UTILITY($JOB,"W",DIWL,LLL))
               if 'LLL
                   QUIT 
               SET ^TMP("PSO",$JOB,PSI,PSNACNT)=^UTILITY($JOB,"W",DIWL,LLL,0)
               SET PSNACNT=PSNACNT+1
               SET PSSEVFL=1
 +6        IF PSSEVFL
               SET ^TMP("PSO",$JOB,PSI,PSNACNT)=" "
               SET PSNACNT=PSNACNT+1
 +7        SET DIWL=1
           SET DIWR=45
           SET DIWF=""
           KILL ^UTILITY($JOB,"W")
           FOR ZZ=0:0
               SET ZZ=$ORDER(^PS(59,PSOSITE,4,ZZ))
               if 'ZZ
                   QUIT 
               IF $DATA(^(ZZ,0))
                   SET X=^(0)
                   DO ^DIWP
 +8        FOR LLL=0:0
               SET LLL=$ORDER(^UTILITY($JOB,"W",DIWL,LLL))
               if 'LLL
                   QUIT 
               SET ^TMP("PSO",$JOB,PSI,PSNACNT)=^UTILITY($JOB,"W",DIWL,LLL,0)
               SET PSNACNT=PSNACNT+1
 +9        if $DATA(FLDX)
               SET ^TMP("PSO",$JOB,PSI,PSNACNT-1)=^TMP("PSO",$JOB,PSI,PSNACNT-1)_FS_"Patient Narrative"
               SET PSI=PSI+1
 +10       KILL DIWF,DIWL,DIWR,LLL,PSNACNT,PSSEVFL,PSSIXFL,ZZ
 +11       QUIT 
NTE3(PSI) ;Drug Warning Narrative
 +1        NEW NTE3,J,TEXT,W,CNT,PSSWSITE
 +2        SET WARN=$PIECE($GET(^PSDRUG(IDGN,0)),"^",8)
 +3        SET PSSWSITE=+$ORDER(^PS(59.7,0))
 +4        IF $PIECE($GET(^PS(59.7,PSSWSITE,10)),"^",11)="N"
               Begin DoDot:1
 +5                SET WARN=$$DRUG^PSSWRNA(IDGN,DFN)
               End DoDot:1
 +6        IF WARN=""
               QUIT 
 +7        SET NTE3="NTE"_FS_3_FS_FS
           SET ^TMP("PSO",$JOB,PSI)=NTE3
           SET CNT=1
 +8        FOR J=1:1
               SET W=$PIECE(WARN,",",J)
               if W=""
                   QUIT 
               Begin DoDot:1
 +9                if CNT>1
                       SET ^TMP("PSO",$JOB,PSI,CNT-1)=^TMP("PSO",$JOB,PSI,CNT-1)_"\.sp\"
 +10               SET TEXT=$$WTEXT^PSSWRNA(W,$GET(OLAN))
                   IF TEXT'=""
                       SET FLDX=1
                       Begin DoDot:2
 +11                       IF $LENGTH(TEXT)<245
                               SET ^TMP("PSO",$JOB,PSI,CNT)=TEXT
                               SET CNT=CNT+1
                               QUIT 
 +12                       NEW LTH,ST,EN,TXT,WW
 +13                       SET LTH=$EXTRACT($LENGTH(TEXT)/245,1)
                           if $LENGTH(TEXT)#245>0
                               SET LTH=LTH+1
 +14                       FOR WW=1:1:LTH
                               Begin DoDot:3
 +15                               if WW=1
                                       SET ST=1
                                       SET EN=245
                                   if WW>1
                                       SET ST=(ST+245)
                                       SET EN=(EN+245)
                                   SET TXT=$EXTRACT(TEXT,ST,EN)
 +16                               SET ^TMP("PSO",$JOB,PSI,CNT)=TXT
                                   SET CNT=CNT+1
                               End DoDot:3
                       End DoDot:2
               End DoDot:1
 +17       IF $GET(FLDX)
               Begin DoDot:1
 +18               IF $LENGTH(^TMP("PSO",$JOB,PSI,CNT-1)_FS_"Drug Warning Narrative")<245
                       SET ^TMP("PSO",$JOB,PSI,CNT-1)=$GET(^TMP("PSO",$JOB,PSI,CNT-1))_FS_"Drug Warning Narrative"
 +19              IF '$TEST
                       SET ^TMP("PSO",$JOB,PSI,CNT)=FS_"Drug Warning Narrative"
               End DoDot:1
               SET PSI=PSI+1
 +20       QUIT 
NTE4(PSI) ;Profile information
 +1        SET PSODFN=DFN
           NEW NTE4
 +2        IF $PIECE(PSOPAR,"^",8)
               DO START^PSOHLDS3
 +3        if $DATA(NTE4)
               SET PSI=PSI+1
 +4        QUIT 
NTE5(PSI) ;Drug Interactions
 +1        NEW NTE5
           if $DATA(DRI)
               DO START2^PSOHLDS3
 +2        if $DATA(NTE5)
               SET ^TMP("PSO",$JOB,PSI)=NTE5_FS_"Drug Interactions"
               SET PSI=PSI+1
 +3        QUIT 
NTE6(PSI) ;Drug Allergy Indications
 +1        NEW NTE6
 +2        if '$GET(DAW)
               QUIT 
 +3        DO START3^PSOHLDS3
 +4        if NTE6=""
               QUIT 
 +5        SET ^TMP("PSO",$JOB,PSI)=NTE6_FS_"Drug Allergy Indications"
           SET PSI=PSI+1
 +6        QUIT 
NTE9(PSI) ;Privacy Notification
 +1        NEW NTE9,PSOLAN
 +2        SET NTE9="NTE"_FS_9_FS_FS
           SET ^TMP("PSO",$JOB,PSI)=NTE9
 +3        SET PSOLAN=$PIECE($GET(^PS(55,DFN,"LAN")),"^",2)
 +4        IF PSOLAN'=2
               Begin DoDot:1
 +5                SET ^TMP("PSO",$JOB,PSI,1)="The VA Notice of Privacy Practices, IB 10-163, which outlines your privacy rights, is available online at http://www1.domain.ext/Health/ or you may obtain a copy by writing the VHA Privacy Office (19F2),"
 +6                SET ^TMP("PSO",$JOB,PSI,2)="810 Vermont Avenue NW, Washington, DC 20420."_FS_"Privacy Notification"
               End DoDot:1
 +7        IF PSOLAN=2
               Begin DoDot:1
 +8                SET ^TMP("PSO",$JOB,PSI,1)="La Notificacion relacionada con las Politicas de Privacidad del Departamento de Asuntos del Veterano, IB 10-163, contiene los detalles acerca de sus derechos de privacidad y esta disponsible electronicamente"
 +9                SET ^TMP("PSO",$JOB,PSI,2)=" en la siguiente direccion: http://www1.domain.ext/Health/.  Usted tambien puede conseguir una copia escribiendo a la Oficina de Privacidad del Departamento de Asuntos de Salud del Veterano, (19F2),"
 +10               SET ^TMP("PSO",$JOB,PSI,3)="810 Vermont Avenue NW, Washington, DC 20420."_FS_"Privacy Notification"
               End DoDot:1
 +11       SET PSI=PSI+1
 +12       QUIT 
ZZZ(PSI)  ;ZZZ segment for HL7 hazardous text ;*524
 +1        NEW DRIEN,HAZD,HAZH,VAR
 +2        SET DRIEN=$PIECE(^PSRX(IRXN,0),"^",6)
 +3        SET VAR=$$HAZ^PSSUTIL(DRIEN)
 +4        SET HAZH=$PIECE(VAR,"^",1)
 +5        SET HAZH=$SELECT(HAZH:"Y",1:"N")
 +6        SET HAZD=$PIECE(VAR,"^",2)
 +7        SET HAZD=$SELECT(HAZD:"Y",1:"N")
 +8        SET ^TMP("PSO",$JOB,PSI)="ZZZ"_FS_FS_FS_FS_HAZH_FS_HAZD
 +9        SET PSI=PSI+1
 +10       QUIT