FBUCPAY ;ALBISC/TET - PAYMENT DRIVER ;12/17/2014
 ;;3.5;FEE BASIS;**7,154**;JAN 30, 1995;Build 12
 ;;Per VA Directive 6402, this routine should not be modified.
ASK ;ask to whom payment should be made, vendor and veteran (to narrow selection)
 S DIR(0)="SMO^1:PATIENT;2:VENDOR",DIR("A")="Select to whom payment should be made" D ^DIR K DIR G END:$D(DIRUT),ASK:'+Y!($G(Y(0))']"")
 S FBPAY=+Y ;1 for patient, 2 for vendor
GET ;get claim for payment, only approved dispositioned claims, non cnh program, ven and vet must match
 K FBVEN,FBVET
VET ;get vet info
 S DIR(0)="162.7,2O",DIR("A")="Select VETERAN" D ^DIR K DIR G END:$D(DIRUT),VET:+Y'>0 S FBVET=+Y
VEN ;get vendor info
 S DIR(0)="162.7,1O",DIR("A")="Select FEE VENDOR" D ^DIR K DIR G END:$D(DUOUT)!($D(DTOUT)),VEN:+Y'>0 S FBVEN=+Y
LOOKUP ;select claim
 S FBIX="APMS",FBIEN=FBVET,FBO="40^70^90^" D DISP7^FBUCUTL5(FBIX,FBIEN,FBO) ;lookup by patient, dispostioned claim only
 ;delete entries from array which don't meet criteria:  program=7(cnh), vendor'=fbven, disposition not approved or approved to stabilization
 S (FBCNT,FBI)=0 F  S FBI=$O(^TMP("FBAR",$J,FBI)) Q:'FBI  S FBZ=$G(^FB583(+^(FBI),0)) D
 .I $S($P(FBZ,U,2)=7:1,$P(FBZ,U,3)'=FBVEN:1,$P(FBZ,U,11)'=1&($P(FBZ,U,11)'=4):1,1:0) D:$$GO(FBI)  K ^TMP("FBAR",$J,FBI) S $P(^("FBAR"),";")=+^TMP("FBAR",$J,"FBAR")-1 Q
 ..S FBZ=$P(^(FBI+1),";")_";  "_$$EXTRL^FBMRASVR($P($P(^(FBI),U),";",2))_U_$P($P(^(FBI+1),U),";",2)_U_$P(^(FBI),U,3,8),$P(FBZ,U,7)="  "_$$EXTRL^FBMRASVR($P(FBZ,U,7)),^TMP("FBAR",$J,FBI+1)=FBZ K FBZ
 .S FBCNT=FBCNT+1 I FBI'=FBCNT S ^TMP("FBAR",$J,FBCNT)=^TMP("FBAR",$J,FBI) K ^TMP("FBAR",$J,FBI)
 D DISPX^FBUCUTL1(1,1) ;display/make selection
 K ^TMP("FBAR",$J) G END:FBOUT!('+$G(FBARY)) ;nothing selected so go to end
LOOP ;loop thru selection and make payments
 N FBDA,FBI,FBNODE,FBP,FBPL,FBW,FBZ D PARSE^FBUCUTL4(FBARY)
 S (FBOUT,FBI)=0 F  S FBI=$O(^TMP("FBARY",$J,FBI)) Q:'FBI  S FBNODE=$G(^(FBI)),FBDA=+$P(FBNODE,";"),FBZ=$G(^FB583(FBDA,0)) D  ;D:$D(FBMESS) WRITE G END:FBOUT,ASK
 .I +$G(FBARY)>1 D LINE^FBUCUTL4(FBNODE,FBI,FBPL,FBW)
 .N FBI,FTP,DUOUT,DTOUT S FBOUT=0 D PAY(FBVET,FBPAY,FBZ)
 D END G ASK
 ;
PAY(FBVET,FBPAY,FBZ) ;determine payments
 I '($P(FBZ,U,11)=1!($P(FBZ,U,11)=4)) W *7 S FBMESS="Unauthorized claim must be Approved or Approved to Stabilization" D WRITE S FBMESS=" in order to make a payment." D WRITE S FBOUT=1 Q
 S (DFN,D0)=FBVET,FBPROG(1)=+$P(FBZ,U,2),FBSUBMIT=$P(FBZ,U,23),FBAAPTC=$S(FBPAY=2:"V",1:"R"),FBAIEN=+$P(FBZ,U,27) ;,FBAAPTC=$S(FBSUBMIT["DPT(":"R",FBSUBMIT["FBAAV(":"V",FBSUBMIT["VA(200,":"O",1:0)
 I FBPROG(1)=7 W *7,! S FBMESS="Fee program is community nursing home." D WRITE S FBMESS="Payments should not be authorized." D WRITE S FBOUT=1 Q
 I FBPROG(1)=6 S DIR(0)="YO",DIR("A")="Is this an ancillary payment",DIR("B")="No" D ^DIR K DIR S:$D(DIRUT) FBOUT=1 Q:$G(FBOUT)  S FBANC=+Y
 S FBPROG="I $P(^(0),""^"",9)[""FB583(""&($P(^(0),""^"",3)="_FBPROG(1)_")"
 S X=FBAIEN,CNT=X,CNT(CNT)=X D 2^FBAAUTL1 I $D(DUOUT)!(FTP']"") S FBOUT=1 Q
 ;
 ; enforce separation of duties
 I '$$UOKPAY^FBUTL9(DFN,FTP) D  S FBOUT=1 Q
 . W !!,"You cannot process a payment associated with authorization ",DFN,"-",FTP
 . W !,"due to separation of duties."
 ;
 I 'FBAIEN W *7 S FBMESS="No authorization associated with this 583!" D WRITE S FBOUT=1 Q
 ;I FB583'=FBDA W *7 S FBMESS="Authorization does not pertain to the selected unauthorized claim." D WRITE S FBOUT=1 Q
 I FBTYPE'=FBPROG(1) W *7 S FBMESS="Authorization Fee program differs from Fee program in Unauthorized Claim." D WRITE S FBOUT=1 Q
 S FBV583=FB583_";FB583("
 D CR Q:FBOUT
 D HOME^%ZIS W @IOF,!?25,"< UNAUTHORIZED CLAIM >",!! S DIC="^FB583(",DA=FB583,DR="0:LOG",DIQ(0)="C" D EN^DIQ W ! K DIC,DIQ,DR,DA,CNT,X
 D CR Q:FBOUT
 D  ;G 2:FBPROG(1)=2,3:FBPROG(1)=3,6:FBPROG(1)=6,7:FBPROG(1)=7
 .;payment for outpatinet
 .I FBPROG(1)=2 D EN583^FBAACO Q
 .;payments for pharmacy
 .I FBPROG(1)=3 D ^FBAAPIE Q
 .;payments for civil hospital
 .I FBPROG(1)=6 S FBI7078=FB583_";FB583(",$P(FBZ(0),"^",4)=$P(FBZ,U,5),FBRESUB="" D EN583^FBCHEP:'FBANC,EN583^FBCHCO:FBANC Q
 .;payments for community nursing home
 .I FBPROG(1)=7 W *7,! S FBMESS="Fee program is community nursing home." D WRITE S FBMESS="Payments should not be authorized." D WRITE
 Q
END ;kill variables and quit
 K FB,FBAABDT,FBAAEDT,FBAAOUT,FBAAPTC,FBAIEN,FBANC,FBASSOC,FBARY,FBCNT,FBDA,FBD1,FBFDC,FBI,FBIEN,FBIX,FBI7078,FBMST,FBO,FBOUT
 K FBRESUB,FBTTYPE,FBDMRA,FBMESS,FBPAY,FBPOV,FBPSA,FBPROG,FBPT,FBSUBMIT,FBTP,FBTT,FBTYPE,FBVEN,FBVET,FBV583,FBZ,FB583,FB7078,FTP
 K CNT,DFN,D0,DTOUT,DUOUT,DIC,DIR,DIRUT,DTOUT,DUOUT,TA,X,Y,^TMP("FBARY",$J)
 Q
WRITE ;write message
 W !?5,FBMESS
 Q
CR ;ask carriage return to continue
 S DIR(0)="E" D ^DIR K DIR I $D(DUOUT)!($D(DTOUT)) S FBOUT=1
 Q
 ;
GO(X) ;X=counter from ^TMP("FBAR",$J,X)
 I '$G(X) Q 0
 Q $S($P($G(^TMP("FBAR",$J,X)),U,3,8)']"":0,'$G(^TMP("FBAR",$J,X+1)):0,$P($G(^TMP("FBAR",$J,X+1)),U,3,8)]"":0,1:1)
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HFBUCPAY   4984     printed  Sep 23, 2025@19:36:30                                                                                                                                                                                                     Page 2
FBUCPAY   ;ALBISC/TET - PAYMENT DRIVER ;12/17/2014
 +1       ;;3.5;FEE BASIS;**7,154**;JAN 30, 1995;Build 12
 +2       ;;Per VA Directive 6402, this routine should not be modified.
ASK       ;ask to whom payment should be made, vendor and veteran (to narrow selection)
 +1        SET DIR(0)="SMO^1:PATIENT;2:VENDOR"
           SET DIR("A")="Select to whom payment should be made"
           DO ^DIR
           KILL DIR
           if $DATA(DIRUT)
               GOTO END
           if '+Y!($GET(Y(0))']"")
               GOTO ASK
 +2       ;1 for patient, 2 for vendor
           SET FBPAY=+Y
GET       ;get claim for payment, only approved dispositioned claims, non cnh program, ven and vet must match
 +1        KILL FBVEN,FBVET
VET       ;get vet info
 +1        SET DIR(0)="162.7,2O"
           SET DIR("A")="Select VETERAN"
           DO ^DIR
           KILL DIR
           if $DATA(DIRUT)
               GOTO END
           if +Y'>0
               GOTO VET
           SET FBVET=+Y
VEN       ;get vendor info
 +1        SET DIR(0)="162.7,1O"
           SET DIR("A")="Select FEE VENDOR"
           DO ^DIR
           KILL DIR
           if $DATA(DUOUT)!($DATA(DTOUT))
               GOTO END
           if +Y'>0
               GOTO VEN
           SET FBVEN=+Y
LOOKUP    ;select claim
 +1       ;lookup by patient, dispostioned claim only
           SET FBIX="APMS"
           SET FBIEN=FBVET
           SET FBO="40^70^90^"
           DO DISP7^FBUCUTL5(FBIX,FBIEN,FBO)
 +2       ;delete entries from array which don't meet criteria:  program=7(cnh), vendor'=fbven, disposition not approved or approved to stabilization
 +3        SET (FBCNT,FBI)=0
           FOR 
               SET FBI=$ORDER(^TMP("FBAR",$JOB,FBI))
               if 'FBI
                   QUIT 
               SET FBZ=$GET(^FB583(+^(FBI),0))
               Begin DoDot:1
 +4                IF $SELECT($PIECE(FBZ,U,2)=7:1,$PIECE(FBZ,U,3)'=FBVEN:1,$PIECE(FBZ,U,11)'=1&($PIECE(FBZ,U,11)'=4):1,1:0)
                       if $$GO(FBI)
                           Begin DoDot:2
 +5                            SET FBZ=$PIECE(^(FBI+1),";")_";  "_$$EXTRL^FBMRASVR($PIECE($PIECE(^(FBI),U),";",2))_U_$PIECE($PIECE(^(FBI+1),U),";",2)_U_$PIECE(^(FBI),U,3,8)
                               SET $PIECE(FBZ,U,7)="  "_$$EXTRL^FBMRASVR($PIECE(FBZ,U,7))
                               SET ^TMP("FBAR",$JOB,FBI+1)=FBZ
                               KILL FBZ
                           End DoDot:2
                       KILL ^TMP("FBAR",$JOB,FBI)
                       SET $PIECE(^("FBAR"),";")=+^TMP("FBAR",$JOB,"FBAR")-1
                       QUIT 
 +6                SET FBCNT=FBCNT+1
                   IF FBI'=FBCNT
                       SET ^TMP("FBAR",$JOB,FBCNT)=^TMP("FBAR",$JOB,FBI)
                       KILL ^TMP("FBAR",$JOB,FBI)
               End DoDot:1
 +7       ;display/make selection
           DO DISPX^FBUCUTL1(1,1)
 +8       ;nothing selected so go to end
           KILL ^TMP("FBAR",$JOB)
           if FBOUT!('+$GET(FBARY))
               GOTO END
LOOP      ;loop thru selection and make payments
 +1        NEW FBDA,FBI,FBNODE,FBP,FBPL,FBW,FBZ
           DO PARSE^FBUCUTL4(FBARY)
 +2       ;D:$D(FBMESS) WRITE G END:FBOUT,ASK
           SET (FBOUT,FBI)=0
           FOR 
               SET FBI=$ORDER(^TMP("FBARY",$JOB,FBI))
               if 'FBI
                   QUIT 
               SET FBNODE=$GET(^(FBI))
               SET FBDA=+$PIECE(FBNODE,";")
               SET FBZ=$GET(^FB583(FBDA,0))
               Begin DoDot:1
 +3                IF +$GET(FBARY)>1
                       DO LINE^FBUCUTL4(FBNODE,FBI,FBPL,FBW)
 +4                NEW FBI,FTP,DUOUT,DTOUT
                   SET FBOUT=0
                   DO PAY(FBVET,FBPAY,FBZ)
               End DoDot:1
 +5        DO END
           GOTO ASK
 +6       ;
PAY(FBVET,FBPAY,FBZ) ;determine payments
 +1        IF '($PIECE(FBZ,U,11)=1!($PIECE(FBZ,U,11)=4))
               WRITE *7
               SET FBMESS="Unauthorized claim must be Approved or Approved to Stabilization"
               DO WRITE
               SET FBMESS=" in order to make a payment."
               DO WRITE
               SET FBOUT=1
               QUIT 
 +2       ;,FBAAPTC=$S(FBSUBMIT["DPT(":"R",FBSUBMIT["FBAAV(":"V",FBSUBMIT["VA(200,":"O",1:0)
           SET (DFN,D0)=FBVET
           SET FBPROG(1)=+$PIECE(FBZ,U,2)
           SET FBSUBMIT=$PIECE(FBZ,U,23)
           SET FBAAPTC=$SELECT(FBPAY=2:"V",1:"R")
           SET FBAIEN=+$PIECE(FBZ,U,27)
 +3        IF FBPROG(1)=7
               WRITE *7,!
               SET FBMESS="Fee program is community nursing home."
               DO WRITE
               SET FBMESS="Payments should not be authorized."
               DO WRITE
               SET FBOUT=1
               QUIT 
 +4        IF FBPROG(1)=6
               SET DIR(0)="YO"
               SET DIR("A")="Is this an ancillary payment"
               SET DIR("B")="No"
               DO ^DIR
               KILL DIR
               if $DATA(DIRUT)
                   SET FBOUT=1
               if $GET(FBOUT)
                   QUIT 
               SET FBANC=+Y
 +5        SET FBPROG="I $P(^(0),""^"",9)[""FB583(""&($P(^(0),""^"",3)="_FBPROG(1)_")"
 +6        SET X=FBAIEN
           SET CNT=X
           SET CNT(CNT)=X
           DO 2^FBAAUTL1
           IF $DATA(DUOUT)!(FTP']"")
               SET FBOUT=1
               QUIT 
 +7       ;
 +8       ; enforce separation of duties
 +9        IF '$$UOKPAY^FBUTL9(DFN,FTP)
               Begin DoDot:1
 +10               WRITE !!,"You cannot process a payment associated with authorization ",DFN,"-",FTP
 +11               WRITE !,"due to separation of duties."
               End DoDot:1
               SET FBOUT=1
               QUIT 
 +12      ;
 +13       IF 'FBAIEN
               WRITE *7
               SET FBMESS="No authorization associated with this 583!"
               DO WRITE
               SET FBOUT=1
               QUIT 
 +14      ;I FB583'=FBDA W *7 S FBMESS="Authorization does not pertain to the selected unauthorized claim." D WRITE S FBOUT=1 Q
 +15       IF FBTYPE'=FBPROG(1)
               WRITE *7
               SET FBMESS="Authorization Fee program differs from Fee program in Unauthorized Claim."
               DO WRITE
               SET FBOUT=1
               QUIT 
 +16       SET FBV583=FB583_";FB583("
 +17       DO CR
           if FBOUT
               QUIT 
 +18       DO HOME^%ZIS
           WRITE @IOF,!?25,"< UNAUTHORIZED CLAIM >",!!
           SET DIC="^FB583("
           SET DA=FB583
           SET DR="0:LOG"
           SET DIQ(0)="C"
           DO EN^DIQ
           WRITE !
           KILL DIC,DIQ,DR,DA,CNT,X
 +19       DO CR
           if FBOUT
               QUIT 
 +20      ;G 2:FBPROG(1)=2,3:FBPROG(1)=3,6:FBPROG(1)=6,7:FBPROG(1)=7
           Begin DoDot:1
 +21      ;payment for outpatinet
 +22           IF FBPROG(1)=2
                   DO EN583^FBAACO
                   QUIT 
 +23      ;payments for pharmacy
 +24           IF FBPROG(1)=3
                   DO ^FBAAPIE
                   QUIT 
 +25      ;payments for civil hospital
 +26           IF FBPROG(1)=6
                   SET FBI7078=FB583_";FB583("
                   SET $PIECE(FBZ(0),"^",4)=$PIECE(FBZ,U,5)
                   SET FBRESUB=""
                   if 'FBANC
                       DO EN583^FBCHEP
                   if FBANC
                       DO EN583^FBCHCO
                   QUIT 
 +27      ;payments for community nursing home
 +28           IF FBPROG(1)=7
                   WRITE *7,!
                   SET FBMESS="Fee program is community nursing home."
                   DO WRITE
                   SET FBMESS="Payments should not be authorized."
                   DO WRITE
           End DoDot:1
 +29       QUIT 
END       ;kill variables and quit
 +1        KILL FB,FBAABDT,FBAAEDT,FBAAOUT,FBAAPTC,FBAIEN,FBANC,FBASSOC,FBARY,FBCNT,FBDA,FBD1,FBFDC,FBI,FBIEN,FBIX,FBI7078,FBMST,FBO,FBOUT
 +2        KILL FBRESUB,FBTTYPE,FBDMRA,FBMESS,FBPAY,FBPOV,FBPSA,FBPROG,FBPT,FBSUBMIT,FBTP,FBTT,FBTYPE,FBVEN,FBVET,FBV583,FBZ,FB583,FB7078,FTP
 +3        KILL CNT,DFN,D0,DTOUT,DUOUT,DIC,DIR,DIRUT,DTOUT,DUOUT,TA,X,Y,^TMP("FBARY",$JOB)
 +4        QUIT 
WRITE     ;write message
 +1        WRITE !?5,FBMESS
 +2        QUIT 
CR        ;ask carriage return to continue
 +1        SET DIR(0)="E"
           DO ^DIR
           KILL DIR
           IF $DATA(DUOUT)!($DATA(DTOUT))
               SET FBOUT=1
 +2        QUIT 
 +3       ;
GO(X)     ;X=counter from ^TMP("FBAR",$J,X)
 +1        IF '$GET(X)
               QUIT 0
 +2        QUIT $SELECT($PIECE($GET(^TMP("FBAR",$JOB,X)),U,3,8)']"":0,'$GET(^TMP("FBAR",$JOB,X+1)):0,$PIECE($GET(^TMP("FBAR",$JOB,X+1)),U,3,8)]"":0,1:1)