PSOHLDS6 ;BIR/MV,RBD - Update Host site for a OneVA fill ;18 Feb 2025  8:56 AM
 ;;7.0;OUTPATIENT PHARMACY;**643,736,774**;DEC 1997;Build 15
 ;
 ; Reference to DUZ^XUP supported by DBIA #4129
 ;
HOST ;Update dispensing information at the host site for a OneVa OPAI fill, p736 - handle possible HLNODE overflow nodes
 N PSOHAIL,PSOHSUB,PSOHORC,PSOHRXD,PSOMSG,J,PSOHIEN,PSOHIENR,PSOHFILL,PSOHCHEK,PSOS5209,PSOHTPE,PSOHFLOT,PSOHSEXP,PSOHSMAN,PSOHSNDC,PSOHNTE,PSOHSUBR
 N ORC K PSOMSG F PSOHAIL=1:1 X HLNEXT Q:HLQUIT'>0  S PSOMSG(PSOHAIL)=HLNODE,J=0 S:$D(HLNODE(PSOHAIL)) HLNODE=HLNODE_HLNODE(PSOHAIL) D
 .I $P(PSOMSG(PSOHAIL),"|")="MSA"!($P(PSOMSG(PSOHAIL),"|")="RXR") Q
 .I $P(PSOMSG(PSOHAIL),"|")="ORC"  S PSOHORC=PSOMSG(PSOHAIL) Q
 .I $P(PSOMSG(PSOHAIL),"|")="RXD" S PSOHRXD=PSOMSG(PSOHAIL) Q
 .I $P(PSOMSG(PSOHAIL),"|")="NTE" S PSOHNTE=PSOMSG(PSOHAIL)
 S PSOHIEN=$P($P($G(PSOHORC),"|",3),"~") I PSOHIEN'="" S PSOHIENR=$O(^PSRX("B",PSOHIEN,0)) Q:'PSOHIENR
 S PSOHFILL=$P($G(PSOHORC),"|",11),PSOHCHEK=$P($G(PSOHORC),"|",12),PSOHTPE=$P($G(PSOHORC),"|",2)
 S PSOHSUB=$P($G(PSOHRXD),"|",2),PSOS5209=$P($G(PSOHRXD),"|",14),PSOHFLOT=$P($G(PSOHRXD),"|",19)
 S PSOHSEXP=$P($G(PSOHRXD),"|",20),PSOHSMAN=$P($G(PSOHRXD),"|",21)
 S PSOHSNDC=$P($G(PSOHRXD),"|",10)
 S PSOHSEXP=$$FMDATE^HLFNC(PSOHSEXP)
 I PSOS5209 D
 .S $P(^PSRXR(52.09,PSOS5209,0),"^",11)=$G(PSOHFILL)
 .S $P(^PSRXR(52.09,PSOS5209,0),"^",12)=$G(PSOHCHEK)
 .I $G(PSOHNTE)'="" D
 ..S $P(^PSRXR(52.09,PSOS5209,4),"^")=$P(PSOHNTE,"|",4)
 ..I $P(PSOHNTE,"|",4)'="" S ^PSRXR(52.09,"F",$P(PSOHNTE,"|",4),PSOS5209)=""
 ..S $P(^PSRXR(52.09,PSOS5209,4),"^",3)=$P(PSOHNTE,"|",5)
 ..S $P(^PSRXR(52.09,PSOS5209,4),"^",4)=$P(PSOHNTE,"|",6)
 ..S $P(^PSRXR(52.09,PSOS5209,4),"^",5)=$P(PSOHNTE,"|",7)
 ; RBD *774 Removed "Q:'PSOHSUB" so that Original Fill logic can pass through
 ;
 S:PSOHTPE="RF" $P(^PSRXR(52.09,PSOS5209,0),"^",13)=PSOHSUB
 S:PSOHTPE="PR" $P(^PSRXR(52.09,PSOS5209,0),"^",14)=PSOHSUB
 ;
 I PSOHIENR D    ; RBD *774 Removed PSOHSUB from IF check so Original Fill logic can be done
 .S:$G(PSOHSUB)]"" PSOHSUBR=$S(PSOHTPE="PR":6,1:$S(PSOHSUB>5:PSOHSUB+1,1:PSOHSUB))   ; RBD *774 If PSOHSUB valued follow usual non-Original Fill path
 .S:$G(PSOHSUB)']"" PSOHSUBR=0 D ACT^PSORREF($S(PSOHTPE="RF":"R",1:"P"),PSOHIENR,PSOHSUBR)   ; RBD *774 Set PSOHSUBR to 0 when PSOHSUB blank (Original Fill path)
 .I $P(^PSRXR(52.09,PSOS5209,4),"^",5) D ACTD^PSORREF("X","HL7 ID "_$P(PSOHNTE,"|",4)_" MESSAGE TRANSMITTED TO "_$P(PSOHNTE,"|",5)_" ("_$P(PSOHNTE,"|",6)_")")
 .D ACTD^PSORREF("N","External Interface Dispensing is Complete.")
 D UPDH^PSORREF
 Q
 ;
UPDHREL ; RBD *774 - UPDHREL New for Auto-Release of Original Fills, Refills and Partial Fills
 ; Logic emulates Auto Release logic from PSOHLDIS, but is crafted for OneVA
 N DIV,DRG,DUZ,PSOCPRX,PSOERR,PSOPAR,PSOSITE,PSRX0,QTY,RELDT,RPHARM,RXP
 S RPHARM=$$FIND1^DIC(200,,"M","PSOAUTORELEASE,PROXY USER") I 'RPHARM S RPHARM=.5
 D DUZ^XUP(RPHARM)   ; DUZ is needed downstream and takes on the value of RPHARM by this call
 S PSRX0=$G(^PSRX(IRX,0)),DRG=$P(PSRX0,"^",6),QTY=$P(PSRX0,"^",7),RELDT=$$NOW^XLFDT
 I FLL="F",'FLLN D   ;Original Fill
 .S DIV=$P($G(^PSRX(IRX,2)),"^",9) I DIV]"",$P($G(^PS(59,DIV,"DISP")),"^",2) D
 ..S PSOPAR=$G(^PS(59,DIV,1)),PSOSITE=DIV
 ..N IRXS K FDA S IRXS=IRX_",",FDA(52,IRXS,31)=RELDT,FDA(52,IRXS,23)=RPHARM
 ..S FDA(52,IRXS,32.1)="@",FDA(52,IRXS,32.2)="@" D FILE^DIE(,"FDA","PSOERR") K FDA
 ..S PSOCPRX=$P(^PSRX(IRX,0),"^"),RXP=IRX D CP^PSOCP S:$G(DIV)']"" DIV=$G(PSOSITE)
 ..D EN^PSOHLSN1(IRX,"ZD"),AUTOREL^PSOBPSUT(IRX,FLLN,RELDT,PSOHSNDC,"A",,30)
 .;else if not auto release
 .E  I $$NDCFMT^PSSNDCUT(PSOHSNDC)'="",$$STATUS^PSOBPSUT(IRX,FLLN)="" D SAVNDC^PSONDCUT(IRX,FLLN,PSOHSNDC)
 I FLL="F",FLLN D   ;Refill
 .S DIV=$P(^PSRX(IRX,1,FLLN,0),"^",9) I DIV]"",$P($G(^PS(59,DIV,"DISP")),"^",2) D
 ..S PSOPAR=$G(^PS(59,DIV,1)),PSOSITE=DIV
 ..N REFIENS K FDA S REFIENS=FLLN_","_IRX_"," S FDA(52.1,REFIENS,17)=RELDT,FDA(52.1,REFIENS,4)=RPHARM
 ..D FILE^DIE(,"FDA") K FDA
 ..N YY S YY=FLLN,PSOCPRX=$P(^PSRX(IRX,0),"^"),RXP=IRX D CP^PSOCP S:$G(DIV)']"" DIV=$G(PSOSITE)
 ..D EN^PSOHLSN1(IRX,"ZD"),AUTOREL^PSOBPSUT(IRX,FLLN,RELDT,PSOHSNDC,"A",,30)
 .;else if not auto release
 .E  I $$NDCFMT^PSSNDCUT(PSOHSNDC)'="",$$STATUS^PSOBPSUT(IRX,FLLN)="" D SAVNDC^PSONDCUT(IRX,FLLN,PSOHSNDC)
 I FLL="P" D   ;Partial Fill
 .S DIV=$P(^PSRX(IRX,"P",FLLN,0),"^",9) I DIV]"",$P($G(^PS(59,DIV,"DISP")),"^",2) D
 ..S PSOPAR=$G(^PS(59,DIV,1)),PSOSITE=DIV
 ..N PARIENS K FDA S PARIENS=FLLN_","_IRX_"," S FDA(52.2,PARIENS,8)=RELDT,FDA(52.2,PARIENS,.05)=RPHARM
 ..D FILE^DIE(,"FDA") K FDA
 S $P(^PSRXR(52.09,PSOS5209,0),"^",16)=RELDT
 Q
 ;
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HPSOHLDS6   4708     printed  Sep 23, 2025@20:06:16                                                                                                                                                                                                    Page 2
PSOHLDS6  ;BIR/MV,RBD - Update Host site for a OneVA fill ;18 Feb 2025  8:56 AM
 +1       ;;7.0;OUTPATIENT PHARMACY;**643,736,774**;DEC 1997;Build 15
 +2       ;
 +3       ; Reference to DUZ^XUP supported by DBIA #4129
 +4       ;
HOST      ;Update dispensing information at the host site for a OneVa OPAI fill, p736 - handle possible HLNODE overflow nodes
 +1        NEW PSOHAIL,PSOHSUB,PSOHORC,PSOHRXD,PSOMSG,J,PSOHIEN,PSOHIENR,PSOHFILL,PSOHCHEK,PSOS5209,PSOHTPE,PSOHFLOT,PSOHSEXP,PSOHSMAN,PSOHSNDC,PSOHNTE,PSOHSUBR
 +2        NEW ORC
           KILL PSOMSG
           FOR PSOHAIL=1:1
               XECUTE HLNEXT
               if HLQUIT'>0
                   QUIT 
               SET PSOMSG(PSOHAIL)=HLNODE
               SET J=0
               if $DATA(HLNODE(PSOHAIL))
                   SET HLNODE=HLNODE_HLNODE(PSOHAIL)
               Begin DoDot:1
 +3                IF $PIECE(PSOMSG(PSOHAIL),"|")="MSA"!($PIECE(PSOMSG(PSOHAIL),"|")="RXR")
                       QUIT 
 +4                IF $PIECE(PSOMSG(PSOHAIL),"|")="ORC"
                       SET PSOHORC=PSOMSG(PSOHAIL)
                       QUIT 
 +5                IF $PIECE(PSOMSG(PSOHAIL),"|")="RXD"
                       SET PSOHRXD=PSOMSG(PSOHAIL)
                       QUIT 
 +6                IF $PIECE(PSOMSG(PSOHAIL),"|")="NTE"
                       SET PSOHNTE=PSOMSG(PSOHAIL)
               End DoDot:1
 +7        SET PSOHIEN=$PIECE($PIECE($GET(PSOHORC),"|",3),"~")
           IF PSOHIEN'=""
               SET PSOHIENR=$ORDER(^PSRX("B",PSOHIEN,0))
               if 'PSOHIENR
                   QUIT 
 +8        SET PSOHFILL=$PIECE($GET(PSOHORC),"|",11)
           SET PSOHCHEK=$PIECE($GET(PSOHORC),"|",12)
           SET PSOHTPE=$PIECE($GET(PSOHORC),"|",2)
 +9        SET PSOHSUB=$PIECE($GET(PSOHRXD),"|",2)
           SET PSOS5209=$PIECE($GET(PSOHRXD),"|",14)
           SET PSOHFLOT=$PIECE($GET(PSOHRXD),"|",19)
 +10       SET PSOHSEXP=$PIECE($GET(PSOHRXD),"|",20)
           SET PSOHSMAN=$PIECE($GET(PSOHRXD),"|",21)
 +11       SET PSOHSNDC=$PIECE($GET(PSOHRXD),"|",10)
 +12       SET PSOHSEXP=$$FMDATE^HLFNC(PSOHSEXP)
 +13       IF PSOS5209
               Begin DoDot:1
 +14               SET $PIECE(^PSRXR(52.09,PSOS5209,0),"^",11)=$GET(PSOHFILL)
 +15               SET $PIECE(^PSRXR(52.09,PSOS5209,0),"^",12)=$GET(PSOHCHEK)
 +16               IF $GET(PSOHNTE)'=""
                       Begin DoDot:2
 +17                       SET $PIECE(^PSRXR(52.09,PSOS5209,4),"^")=$PIECE(PSOHNTE,"|",4)
 +18                       IF $PIECE(PSOHNTE,"|",4)'=""
                               SET ^PSRXR(52.09,"F",$PIECE(PSOHNTE,"|",4),PSOS5209)=""
 +19                       SET $PIECE(^PSRXR(52.09,PSOS5209,4),"^",3)=$PIECE(PSOHNTE,"|",5)
 +20                       SET $PIECE(^PSRXR(52.09,PSOS5209,4),"^",4)=$PIECE(PSOHNTE,"|",6)
 +21                       SET $PIECE(^PSRXR(52.09,PSOS5209,4),"^",5)=$PIECE(PSOHNTE,"|",7)
                       End DoDot:2
               End DoDot:1
 +22      ; RBD *774 Removed "Q:'PSOHSUB" so that Original Fill logic can pass through
 +23      ;
 +24       if PSOHTPE="RF"
               SET $PIECE(^PSRXR(52.09,PSOS5209,0),"^",13)=PSOHSUB
 +25       if PSOHTPE="PR"
               SET $PIECE(^PSRXR(52.09,PSOS5209,0),"^",14)=PSOHSUB
 +26      ;
 +27      ; RBD *774 Removed PSOHSUB from IF check so Original Fill logic can be done
           IF PSOHIENR
               Begin DoDot:1
 +28      ; RBD *774 If PSOHSUB valued follow usual non-Original Fill path
                   if $GET(PSOHSUB)]""
                       SET PSOHSUBR=$SELECT(PSOHTPE="PR":6,1:$SELECT(PSOHSUB>5:PSOHSUB+1,1:PSOHSUB))
 +29      ; RBD *774 Set PSOHSUBR to 0 when PSOHSUB blank (Original Fill path)
                   if $GET(PSOHSUB)']""
                       SET PSOHSUBR=0
                   DO ACT^PSORREF($SELECT(PSOHTPE="RF":"R",1:"P"),PSOHIENR,PSOHSUBR)
 +30               IF $PIECE(^PSRXR(52.09,PSOS5209,4),"^",5)
                       DO ACTD^PSORREF("X","HL7 ID "_$PIECE(PSOHNTE,"|",4)_" MESSAGE TRANSMITTED TO "_$PIECE(PSOHNTE,"|",5)_" ("_$PIECE(PSOHNTE,"|",6)_")")
 +31               DO ACTD^PSORREF("N","External Interface Dispensing is Complete.")
               End DoDot:1
 +32       DO UPDH^PSORREF
 +33       QUIT 
 +34      ;
UPDHREL   ; RBD *774 - UPDHREL New for Auto-Release of Original Fills, Refills and Partial Fills
 +1       ; Logic emulates Auto Release logic from PSOHLDIS, but is crafted for OneVA
 +2        NEW DIV,DRG,DUZ,PSOCPRX,PSOERR,PSOPAR,PSOSITE,PSRX0,QTY,RELDT,RPHARM,RXP
 +3        SET RPHARM=$$FIND1^DIC(200,,"M","PSOAUTORELEASE,PROXY USER")
           IF 'RPHARM
               SET RPHARM=.5
 +4       ; DUZ is needed downstream and takes on the value of RPHARM by this call
           DO DUZ^XUP(RPHARM)
 +5        SET PSRX0=$GET(^PSRX(IRX,0))
           SET DRG=$PIECE(PSRX0,"^",6)
           SET QTY=$PIECE(PSRX0,"^",7)
           SET RELDT=$$NOW^XLFDT
 +6       ;Original Fill
           IF FLL="F"
               IF 'FLLN
                   Begin DoDot:1
 +7                    SET DIV=$PIECE($GET(^PSRX(IRX,2)),"^",9)
                       IF DIV]""
                           IF $PIECE($GET(^PS(59,DIV,"DISP")),"^",2)
                               Begin DoDot:2
 +8                                SET PSOPAR=$GET(^PS(59,DIV,1))
                                   SET PSOSITE=DIV
 +9                                NEW IRXS
                                   KILL FDA
                                   SET IRXS=IRX_","
                                   SET FDA(52,IRXS,31)=RELDT
                                   SET FDA(52,IRXS,23)=RPHARM
 +10                               SET FDA(52,IRXS,32.1)="@"
                                   SET FDA(52,IRXS,32.2)="@"
                                   DO FILE^DIE(,"FDA","PSOERR")
                                   KILL FDA
 +11                               SET PSOCPRX=$PIECE(^PSRX(IRX,0),"^")
                                   SET RXP=IRX
                                   DO CP^PSOCP
                                   if $GET(DIV)']""
                                       SET DIV=$GET(PSOSITE)
 +12                               DO EN^PSOHLSN1(IRX,"ZD")
                                   DO AUTOREL^PSOBPSUT(IRX,FLLN,RELDT,PSOHSNDC,"A",,30)
                               End DoDot:2
 +13      ;else if not auto release
 +14                  IF '$TEST
                           IF $$NDCFMT^PSSNDCUT(PSOHSNDC)'=""
                               IF $$STATUS^PSOBPSUT(IRX,FLLN)=""
                                   DO SAVNDC^PSONDCUT(IRX,FLLN,PSOHSNDC)
                   End DoDot:1
 +15      ;Refill
           IF FLL="F"
               IF FLLN
                   Begin DoDot:1
 +16                   SET DIV=$PIECE(^PSRX(IRX,1,FLLN,0),"^",9)
                       IF DIV]""
                           IF $PIECE($GET(^PS(59,DIV,"DISP")),"^",2)
                               Begin DoDot:2
 +17                               SET PSOPAR=$GET(^PS(59,DIV,1))
                                   SET PSOSITE=DIV
 +18                               NEW REFIENS
                                   KILL FDA
                                   SET REFIENS=FLLN_","_IRX_","
                                   SET FDA(52.1,REFIENS,17)=RELDT
                                   SET FDA(52.1,REFIENS,4)=RPHARM
 +19                               DO FILE^DIE(,"FDA")
                                   KILL FDA
 +20                               NEW YY
                                   SET YY=FLLN
                                   SET PSOCPRX=$PIECE(^PSRX(IRX,0),"^")
                                   SET RXP=IRX
                                   DO CP^PSOCP
                                   if $GET(DIV)']""
                                       SET DIV=$GET(PSOSITE)
 +21                               DO EN^PSOHLSN1(IRX,"ZD")
                                   DO AUTOREL^PSOBPSUT(IRX,FLLN,RELDT,PSOHSNDC,"A",,30)
                               End DoDot:2
 +22      ;else if not auto release
 +23                  IF '$TEST
                           IF $$NDCFMT^PSSNDCUT(PSOHSNDC)'=""
                               IF $$STATUS^PSOBPSUT(IRX,FLLN)=""
                                   DO SAVNDC^PSONDCUT(IRX,FLLN,PSOHSNDC)
                   End DoDot:1
 +24      ;Partial Fill
           IF FLL="P"
               Begin DoDot:1
 +25               SET DIV=$PIECE(^PSRX(IRX,"P",FLLN,0),"^",9)
                   IF DIV]""
                       IF $PIECE($GET(^PS(59,DIV,"DISP")),"^",2)
                           Begin DoDot:2
 +26                           SET PSOPAR=$GET(^PS(59,DIV,1))
                               SET PSOSITE=DIV
 +27                           NEW PARIENS
                               KILL FDA
                               SET PARIENS=FLLN_","_IRX_","
                               SET FDA(52.2,PARIENS,8)=RELDT
                               SET FDA(52.2,PARIENS,.05)=RPHARM
 +28                           DO FILE^DIE(,"FDA")
                               KILL FDA
                           End DoDot:2
               End DoDot:1
 +29       SET $PIECE(^PSRXR(52.09,PSOS5209,0),"^",16)=RELDT
 +30       QUIT 
 +31      ;