RCRPSTR ;EDE/YMG - REPAYMENT PLAN STATUS REPORT; 11/30/2020
 ;;4.5;Accounts Receivable;**381,390,396,378,389**;Mar 20, 1995;Build 36
 ;;Per VA Directive 6402, this routine should not be modified.
 ;
 Q
 ;
EN ; entry point
 N EXCEL,FILTER,POP,SORT,ZTDESC,ZTRTN,ZTSAVE,ZTSK,%ZIS
 K ^TMP("RCRPSTR",$J)
 W !!,"Repayment Plan Status Report",!
 ; sort by?
 S SORT=$$ASKSORT() I SORT=-1 Q
 ; filter by?
 S FILTER=$$ASKFLTR() I FILTER=-1 Q
 ; export to Excel?
 S EXCEL=$$ASKEXCEL^RCRPRPU() I EXCEL<0 Q
 ;Device settings printout
 I EXCEL D EXCMSG^RCTCSJR    ; Display Excel display message
 I 'EXCEL W !!,"This report requires 132 column display.",!
 ; ask for device
 K IOP,IO("Q")
 S %ZIS="MQ",%ZIS("B")="",POP=0 D ^%ZIS Q:POP
 I $D(IO("Q")) D  Q  ; queued report
 .S ZTDESC="Repayment Plan Status Report",ZTRTN="COMPILE^RCRPSTR"
 .S ZTSAVE("FILTER")="",ZTSAVE("SORT")="",ZTSAVE("EXCEL")="",ZTSAVE("ZTREQ")="@"
 .D ^%ZTLOAD,HOME^%ZIS
 .I $G(ZTSK) W !!,"Report compilation has started with task# ",ZTSK,".",! D PAUSE^RCRPRPU
 .Q
 D COMPILE
 ;
 Q
 ;
ASKSORT() ; display "sort by" prompt
 ;
 ; returns N for debtor name, S for status, A for account balance, -1 for user exit / timeout
 ;
 N DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 S DIR(0)="SA^N:Name;S:Status;A:Account Balance",DIR("B")="N"
 S DIR("A")="Sort By Debtor (N)ame, (S)tatus or (A)ccount Balance: "
 D ^DIR I $D(DIRUT)!$D(DTOUT)!$D(DUOUT)!$D(DIROUT) Q -1
 Q Y
 ;
ASKFLTR() ; display "filter by" prompt
 ;
 ; returns "N ^ start name ^ end name" for debtor name,
 ;         "S ^ selected statuses ^ min days in status ^ max days in status" for status,
 ;         "U" for no filter,
 ;         -1 for user exit / timeout
 ;
 N RES,STOP,Z,RCANS
 N DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 S DIR(0)="SA^N:Name;S:Status;U:Unfiltered",DIR("B")="S"
 S DIR("A")="Filter By Debtor (N)ame, (S)tatus or (U)nfiltered: "
 S STOP=0 F  D  Q:STOP
 .D ^DIR I $D(DIRUT)!$D(DTOUT)!$D(DUOUT)!$D(DIROUT) S RES=-1,STOP=1 Q
 .S RES=Y
 .I RES="N" D  Q
 ..S Z=$$INTV   ; Ask for the First and last name
 ..I Z=-1 S RES=-1,STOP=1 Q
 ..S $P(RES,U,2)=$P(Z,U),$P(RES,U,3)=$P(Z,U,2),STOP=1
 ..Q
 .I RES="S" D
 ..S Z=$$ASKSTAT() I (Z=-1)!(Z="Q") S RES=-1,STOP=1 Q
 ..S $P(RES,U,2)=Z
 ..S Z=$$ASKDAYS() I Z=-1 S RES=-1,STOP=1 Q
 ..S $P(RES,U,3)=Z
 ..S Z=$$ASKDAYS1($P(RES,U,3)) I Z=-1 S RES=-1,STOP=1 Q  ; PRCA*4.5*389
 ..S $P(RES,U,4)=Z,STOP=1
 ..Q
 .S STOP=1
 .Q
 Q RES
 ;
ASKNM(SNAME) ; display "start with name" / "end with name" prompts
 ;
 ; SNAME - starting name (selected at "start with name" prompt), used in screen, optional
 ;
 ; returns selected debtor name or -1 for no selection / user exit / timeout
 ;
 N DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 S SNAME=$G(SNAME,"")
 S DIR(0)="PAO^340:EBS"
 S DIR("A")=$S(SNAME="":"Start",1:"End")_" with name: "
 I SNAME'="" S DIR("S")="I $$NAM^RCFN01(Y)]"""_SNAME_""""
 D ^DIR I $D(DIRUT)!$D(DTOUT)!$D(DUOUT)!$D(DIROUT) Q -1
 Q $$NAM^RCFN01($P(Y,U))
 ;
ASKSTAT() ; display "which statuses" prompt
 ;
 ; returns selected statuses (comma separated list of internal codes from 340.5/.07) or -1 for no selection / user exit / timeout
 ;
 N RES,SEL,STOP,STSTR
 N DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 S STSTR="NCLDFTSP"
 S DIR(0)="SAO^A:All;N:New;C:Current;L:Late;D:Delinquent;P:Paid in Full;S:Closed;F:Defaulted;T:Terminated;U:Continue;Q:Quit"
 S DIR("A",1)=""
 S DIR("A",2)="Statuses available:"
 S DIR("A",3)="  (A)ll, (N)ew, (C)urrent, (L)ate, (D)elinquent, (P)aid in Full, Clo(S)ed,"
 S DIR("A",4)="         De(F)aulted, (T)erminated,"
 S DIR("A",5)=""
 S DIR("A",6)=""
 S DIR("A",7)=""
 S DIR("A")="Select Status to add, Enter to continue or (Q)uit? "
 S (RES,SEL)="",STOP=0 F  D  Q:STOP
 .I SEL'="" S DIR("A",6)="Statuses currently selected: "_SEL
 .D ^DIR
 .I Y="" S STOP=1 Q    ;User is ready to enter the days.
 .I $D(DUOUT)!$D(DIROUT) S RES=-1,STOP=1 Q   ;User issued exit command, leave utilitystandard time out or ^ escape
 .I $D(DIRUT)!$D(DTOUT) S STOP=1 Q   ;standard time out or ^ escape
 .I Y="A" D  Q     ;User selected all available statuses for report
 ..S RES="1,2,3,4,7,8,5,6"
 ..S SEL="New,Current,Late,Delinquent,Paid in Full,Closed,Defaulted,Terminated"
 ..S STOP=1
 .I Y="Q" S RES=-1,STOP=1 Q
 .I Y="U" S STOP=1 Q
 .I SEL'[Y(0) D
 ..S RES=RES_$S(RES'="":","_($F(STSTR,Y)-1),1:$F(STSTR,Y)-1)
 ..S SEL=SEL_$S(SEL'="":", "_Y(0),1:Y(0))
 ..Q
 .I $L(RES,",")=8 S STOP=1  ; all statuses selected - we're done
 .Q
 Q $S(RES="":-1,1:RES)
 ;
ASKDAYS() ; display "min. days in status" prompt
 ;
 ; returns min. # of days in status or -1 for no selection / user exit / timeout
 ;
 N DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 W !
 S DIR(0)="NA^0:999:0"
 S DIR("A")="Enter the Minimum # of Days in Status or ^ to quit: "
 D ^DIR I $D(DIRUT)!$D(DTOUT)!$D(DUOUT)!$D(DIROUT) Q -1
 Q Y
 ;
ASKDAYS1(MINDAYS) ; display "max. days in status" prompt  PRCA*4.5*389
 ;
 ; returns max. # of days in status or -1 for no selection / user exit / timeout
 ;
 N DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 W !
 S DIR(0)="NAO^"_MINDAYS_":999:0"
 S DIR("A")="Enter the Maximum # of Days in Status or ^ to quit: "
 D ^DIR I $D(DTOUT)!$D(DUOUT)!$D(DIROUT) Q -1
 Q Y
 ;
COMPILE ; compile report
 N BEGDT,CNT,ENDDT,NAME,RPIEN,STATDT,STATUS,STLIST,Z
 ;
 S CNT=0
 I $P(FILTER,U)="S" D
 .; filtering by statuses
 .S BEGDT=$$FMADD^XLFDT(DT,-$P(FILTER,U,3),,1) ; date to begin the search with
 .S Z=$P(FILTER,U,4),ENDDT="" I Z>0 S ENDDT=$$FMADD^XLFDT(DT,-$P(FILTER,U,4),,-1) ; date to end the search with  PRCA*4.5*389
 .S STLIST=$P(FILTER,U,2) F Z=1:1:$L(STLIST,",") S STATUS=$P(STLIST,",",Z) D
 ..S STATDT=BEGDT F  S STATDT=$O(^RCRP(340.5,"D",STATUS,STATDT),-1) Q:'STATDT!(ENDDT'=""&(STATDT<ENDDT))  D  ; PRCA*4.5*389
 ...S RPIEN="" F  S RPIEN=$O(^RCRP(340.5,"D",STATUS,STATDT,RPIEN)) Q:'RPIEN  S CNT=CNT+1 D GETDATA(RPIEN,CNT)
 ...Q
 ..Q
 .Q
 I $P(FILTER,U)="N"!($P(FILTER,U)="U") D
 .; filtering by name or no filter
 .S Z="" F  S Z=$O(^RCRP(340.5,"B",Z)) Q:'Z  D
 ..S RPIEN=$O(^RCRP(340.5,"B",Z,"")) Q:'RPIEN
 ..I $P(FILTER,U)="N" S NAME=$$NAM^RCFN01($P(^RCRP(340.5,RPIEN,0),U,2)) Q:$P(FILTER,U,2)]NAME  Q:NAME]$P(FILTER,U,3)
 ..S CNT=CNT+1 D GETDATA(RPIEN,CNT)
 ..Q
 .Q
 D PRINT
 K ^TMP("RCRPSTR",$J)
 Q
 ;
GETDATA(RPIEN,CNT) ; fetch data and put it into ^TMP global
 ;
 ; RPIEN - file 340.5 ien
 ; CNT   - sequential # of ^TMP entry to create
 ;
 N AMNT,DAYS,DEBTOR,N0,MED,SSN,TMPSTR,Z,ORPLNDT,RMNOPY
 I RPIEN'>0!(CNT'>0) Q
 S N0=^RCRP(340.5,RPIEN,0)                    ; 0-node in file 340.5
 S DEBTOR=$P(N0,U,2)                          ; pointer to file 340
 S ORPLNDT=$P(N0,U,3)                         ; Original Plan Date (Creation Date)
 S NAME=$$NAM^RCFN01(DEBTOR) Q:NAME=""        ; debtor name
 S MED=1 I DEBTOR>0,$P($P(^RCD(340,DEBTOR,0),U),";",2)'="DPT(" S MED=0  ; non-medical debt  PRCA*4.5*389
 S SSN=$$SSN^RCFN01(DEBTOR)                   ; debtor SSN
 S AMNT=$$CBAL^RCRPU3(RPIEN,+$P(N0,U,11))     ; amount owed
 S DAYS=$$FMDIFF^XLFDT(DT,$P(N0,U,8))         ; days in status
 S RMNOPY=$$REMPMNTS^RCRPU3(RPIEN,$P(N0,U,6)) ; remaining # payments
 ; each entry is: debtor name ^ ssn ^ repayment plan ID ^ Original Plan Date ^ status (internal) ^ status date ^ days in status ^ last payment date ^ # of payments ^
 ;                remaining balance ^ at CS? ^ # of forbearances ^ medical debt (1/0)
 S TMPSTR=NAME_U_SSN_U_$P(N0,U)_U_ORPLNDT_U_$P(N0,U,7)_U_$P(N0,U,8)_U_DAYS
 S TMPSTR=TMPSTR_U_$O(^RCRP(340.5,RPIEN,3,"B",""),-1) ; last payment date
 S TMPSTR=TMPSTR_U_RMNOPY_U_AMNT_U_$P($G(^RCRP(340.5,RPIEN,1)),U,4)_U_$P(N0,U,9)_U_MED
 ; add a new entry to ^TMP global
 S ^TMP("RCRPSTR",$J,CNT)=TMPSTR
 S Z=$S(SORT="N":NAME,SORT="S":$$EXTERNAL^DILFD(340.5,.07,,$P(N0,U,7)),1:AMNT) Q:Z=""
 S ^TMP("RCRPSTR",$J,"IDX",Z,DAYS,CNT)=""
 Q
 ;
PRINT ; print report
 N ATCS,BAL,CNT,DATA,DAYS,EXTDT,LN,NAME,PAGE,SSN,STATUS,Z,Z1,QUIT
 U IO
 S PAGE=0
 S EXTDT=$$FMTE^XLFDT(DT)
 S QUIT=0
 I EXCEL D
 .W !,"Repayment Plan Status Report^",EXTDT,U,$$FLTRSTR(),U,$$SORTSTR()  ; PRCA*4.5*389
 .W !,"Name^SSN^RPP ID^Orig Plan date^Status^Status date^Days in status^Last payment^Current plan length^Remaining balance^CS^Forbearances"  ; PRCA*4.5*389
 .Q
 I 'EXCEL D
 .I $E(IOST,1,2)["C-",'$D(ZTQUEUED) W @IOF
 .D HDR
 .Q
 I '$D(^TMP("RCRPSTR",$J)) D  Q
 .I EXCEL W !!,"No records found." Q
 .W !!,$$CJ^XLFSTR("No records found.",132)
 .Q
 S Z="" F  S Z=$O(^TMP("RCRPSTR",$J,"IDX",Z)) Q:Z=""  D  Q:$G(QUIT)
 .S DAYS="" F  S DAYS=$O(^TMP("RCRPSTR",$J,"IDX",Z,DAYS),-1) Q:DAYS=""  D  Q:$G(QUIT)
 ..S CNT=0 F  S CNT=$O(^TMP("RCRPSTR",$J,"IDX",Z,DAYS,CNT)) Q:'CNT  D  Q:$G(QUIT)
 ...S DATA=^TMP("RCRPSTR",$J,CNT),NAME=$S($P(DATA,U,13):"",1:"*")_$P(DATA,U)  ; PRCA*4.5*389
 ...; convert status code
 ...S Z1=$P(DATA,U,5),STATUS=$S(Z1=1:"NEW",Z1=2:"CURR",Z1=3:"LATE",Z1=4:"DELQ",Z1=5:"DEF",Z1=6:"TERM",Z1=7:"CLOS",Z1=8:"PAID",1:"")
 ...; format remaining balance
 ...S BAL=$FN($P(DATA,U,10),"",2)
 ...; convert "at CS" value
 ...S ATCS=$S($P(DATA,U,11):"Y",1:"N")
 ...; format SSN to last 4 digits
 ...S Z1=$P(DATA,U,2),SSN=$E(Z1,$L(Z1)-3,$L(Z1)) I SSN'>0 S SSN="N/A"
 ...I EXCEL D  Q
 ....W !,NAME,U,SSN,U,$P(DATA,U,3),U,$$FMTE^XLFDT($P(DATA,U,4),"2DZ"),U,STATUS,U,$$FMTE^XLFDT($P(DATA,U,6),"2DZ"),U,$P(DATA,U,7),U  ; PRCA*4.5*389
 ....W $$FMTE^XLFDT($P(DATA,U,8),"2DZ"),U,$P(DATA,U,9),U,BAL,U,ATCS,U,$P(DATA,U,12)  ; 
 ....Q
 ...S LN=LN+1
 ...W !,$E(NAME,1,30),?31,SSN,?37,$P(DATA,U,3),?57,$$FMTE^XLFDT($P(DATA,U,4),"2DZ"),?67,STATUS,?73,$$FMTE^XLFDT($P(DATA,U,6),"2DZ"),?83,$P(DATA,U,7),?92  ; PRCA*4.5*389
 ...W $$FMTE^XLFDT($P(DATA,U,8),"2DZ"),?102,$P(DATA,U,9),?112,$$CJ^XLFSTR("$"_BAL,13),?123,ATCS,?127,$P(DATA,U,12)  ; PRCA*4.5*389
 ...I LN>(IOSL-3) D HDR I $G(QUIT) Q
 ...Q
 ..Q
 .Q
 I PAGE>0,'$D(ZTQUEUED) D PAUSE^RCRPRPU W @IOF
 Q
 ;
HDR ; print header
 I PAGE>0,'$D(ZTQUEUED) D PAUSE^RCRPU W @IOF I $G(QUIT) Q
 S PAGE=PAGE+1,LN=9  ; PRCA*4.5*389
 W !,"Repayment Plan Status Report",?66,EXTDT,?120,"Page: ",PAGE
 W !,$$FLTRSTR()
 W !,$$SORTSTR()
 W !!,"* Indicates a non-medical debt repayment plan"  ; PRCA*4.5*389
 W !!,"                                                                                                                               For-"
 W !,"                                                         Original        Status    Days in   Last     Cur plan  Remaining      bear-"
 W !,"Name                           SSN        RPP ID         Plan Dt   Stat   date     status   payment    length    balance   CS  ances"
 W ! D DASH^RCRPRPU(132)
 Q
 ;
FLTRSTR() ; returns "Filtered by" string to print
 N STR,Z
 S STR="Filtered by: "
 I $P(FILTER,U)="U" S STR=STR_"No filter"
 I $P(FILTER,U)="N" S STR=STR_"Debtor name (from "_$P(FILTER,U,2)_" to "_$P(FILTER,U,3)_")"
 I $P(FILTER,U)="S" D
 .S STR=STR_"Status ("
 .F Z=1:1:$L($P(FILTER,U,2),",") S STR=STR_$S(Z>1:", ",1:"")_$$EXTERNAL^DILFD(340.5,.07,,$P($P(FILTER,U,2),",",Z))  ; PRCA*4.5*378
 .S STR=STR_"), "_$S(+$P(FILTER,U,4)>0:"from "_$P(FILTER,U,3)_" to "_$P(FILTER,U,4),1:"at least "_$P(FILTER,U,3))  ; PRCA*4.5*389
 .S STR=STR_" days in status"  ; PRCA*4.5*389
 .Q 
 Q STR
 ;
SORTSTR() ; returns "Sorted by" string to print
 N STR
 S STR="Sorted by: "_$S(SORT="N":"Debtor name",SORT="S":"Status",1:"Account balance")
 Q STR
 ;
 ; Select name range
INTV() ; Selects the range of names
 ; Output: First value ^ Last Value OR -1 
 ;
 N RCFRST,RCLAST,X
 ;
 S (RCFRST,RCLAST)=""
FRST W !!?3,"START WITH NAME: FIRST// " R X:DTIME I '$T!(X["^") Q -1
 I $E(X)="?" D HFST(1) G FRST
 S RCFRST=X
LAST W !?8,"GO TO NAME: LAST// " R X:DTIME I '$T!(X["^") Q -1
 I $E(X)="?" D HFST(2) G LAST
 I X="" S RCLAST="zzzzz" G QINT
 I RCFRST]X D  G LAST
 .W *7,!!?7,"The LAST value must follow the FIRST.",!
 S RCLAST=X
 ;
QINT Q (RCFRST_"^"_RCLAST)
 ;
HFST(RCVAL) ; - 'START WITH PATIENT/DEBTOR...' prompt 
 N RCPRMPT
 S RCPRMPT="First" S:RCVAL=2 RCPRMPT="Last"
 ;
 W !!,"      Enter a valid field value, or"
 W !,"        '<CR>' -  To start from the '"_RCPRMPT_"' value for this field"
 W !,"        '^'    -  To quit this option"
 Q
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HRCRPSTR   12203     printed  Sep 23, 2025@19:24:35                                                                                                                                                                                                    Page 2
RCRPSTR   ;EDE/YMG - REPAYMENT PLAN STATUS REPORT; 11/30/2020
 +1       ;;4.5;Accounts Receivable;**381,390,396,378,389**;Mar 20, 1995;Build 36
 +2       ;;Per VA Directive 6402, this routine should not be modified.
 +3       ;
 +4        QUIT 
 +5       ;
EN        ; entry point
 +1        NEW EXCEL,FILTER,POP,SORT,ZTDESC,ZTRTN,ZTSAVE,ZTSK,%ZIS
 +2        KILL ^TMP("RCRPSTR",$JOB)
 +3        WRITE !!,"Repayment Plan Status Report",!
 +4       ; sort by?
 +5        SET SORT=$$ASKSORT()
           IF SORT=-1
               QUIT 
 +6       ; filter by?
 +7        SET FILTER=$$ASKFLTR()
           IF FILTER=-1
               QUIT 
 +8       ; export to Excel?
 +9        SET EXCEL=$$ASKEXCEL^RCRPRPU()
           IF EXCEL<0
               QUIT 
 +10      ;Device settings printout
 +11      ; Display Excel display message
           IF EXCEL
               DO EXCMSG^RCTCSJR
 +12       IF 'EXCEL
               WRITE !!,"This report requires 132 column display.",!
 +13      ; ask for device
 +14       KILL IOP,IO("Q")
 +15       SET %ZIS="MQ"
           SET %ZIS("B")=""
           SET POP=0
           DO ^%ZIS
           if POP
               QUIT 
 +16      ; queued report
           IF $DATA(IO("Q"))
               Begin DoDot:1
 +17               SET ZTDESC="Repayment Plan Status Report"
                   SET ZTRTN="COMPILE^RCRPSTR"
 +18               SET ZTSAVE("FILTER")=""
                   SET ZTSAVE("SORT")=""
                   SET ZTSAVE("EXCEL")=""
                   SET ZTSAVE("ZTREQ")="@"
 +19               DO ^%ZTLOAD
                   DO HOME^%ZIS
 +20               IF $GET(ZTSK)
                       WRITE !!,"Report compilation has started with task# ",ZTSK,".",!
                       DO PAUSE^RCRPRPU
 +21               QUIT 
               End DoDot:1
               QUIT 
 +22       DO COMPILE
 +23      ;
 +24       QUIT 
 +25      ;
ASKSORT() ; display "sort by" prompt
 +1       ;
 +2       ; returns N for debtor name, S for status, A for account balance, -1 for user exit / timeout
 +3       ;
 +4        NEW DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 +5        SET DIR(0)="SA^N:Name;S:Status;A:Account Balance"
           SET DIR("B")="N"
 +6        SET DIR("A")="Sort By Debtor (N)ame, (S)tatus or (A)ccount Balance: "
 +7        DO ^DIR
           IF $DATA(DIRUT)!$DATA(DTOUT)!$DATA(DUOUT)!$DATA(DIROUT)
               QUIT -1
 +8        QUIT Y
 +9       ;
ASKFLTR() ; display "filter by" prompt
 +1       ;
 +2       ; returns "N ^ start name ^ end name" for debtor name,
 +3       ;         "S ^ selected statuses ^ min days in status ^ max days in status" for status,
 +4       ;         "U" for no filter,
 +5       ;         -1 for user exit / timeout
 +6       ;
 +7        NEW RES,STOP,Z,RCANS
 +8        NEW DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 +9        SET DIR(0)="SA^N:Name;S:Status;U:Unfiltered"
           SET DIR("B")="S"
 +10       SET DIR("A")="Filter By Debtor (N)ame, (S)tatus or (U)nfiltered: "
 +11       SET STOP=0
           FOR 
               Begin DoDot:1
 +12               DO ^DIR
                   IF $DATA(DIRUT)!$DATA(DTOUT)!$DATA(DUOUT)!$DATA(DIROUT)
                       SET RES=-1
                       SET STOP=1
                       QUIT 
 +13               SET RES=Y
 +14               IF RES="N"
                       Begin DoDot:2
 +15      ; Ask for the First and last name
                           SET Z=$$INTV
 +16                       IF Z=-1
                               SET RES=-1
                               SET STOP=1
                               QUIT 
 +17                       SET $PIECE(RES,U,2)=$PIECE(Z,U)
                           SET $PIECE(RES,U,3)=$PIECE(Z,U,2)
                           SET STOP=1
 +18                       QUIT 
                       End DoDot:2
                       QUIT 
 +19               IF RES="S"
                       Begin DoDot:2
 +20                       SET Z=$$ASKSTAT()
                           IF (Z=-1)!(Z="Q")
                               SET RES=-1
                               SET STOP=1
                               QUIT 
 +21                       SET $PIECE(RES,U,2)=Z
 +22                       SET Z=$$ASKDAYS()
                           IF Z=-1
                               SET RES=-1
                               SET STOP=1
                               QUIT 
 +23                       SET $PIECE(RES,U,3)=Z
 +24      ; PRCA*4.5*389
                           SET Z=$$ASKDAYS1($PIECE(RES,U,3))
                           IF Z=-1
                               SET RES=-1
                               SET STOP=1
                               QUIT 
 +25                       SET $PIECE(RES,U,4)=Z
                           SET STOP=1
 +26                       QUIT 
                       End DoDot:2
 +27               SET STOP=1
 +28               QUIT 
               End DoDot:1
               if STOP
                   QUIT 
 +29       QUIT RES
 +30      ;
ASKNM(SNAME) ; display "start with name" / "end with name" prompts
 +1       ;
 +2       ; SNAME - starting name (selected at "start with name" prompt), used in screen, optional
 +3       ;
 +4       ; returns selected debtor name or -1 for no selection / user exit / timeout
 +5       ;
 +6        NEW DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 +7        SET SNAME=$GET(SNAME,"")
 +8        SET DIR(0)="PAO^340:EBS"
 +9        SET DIR("A")=$SELECT(SNAME="":"Start",1:"End")_" with name: "
 +10       IF SNAME'=""
               SET DIR("S")="I $$NAM^RCFN01(Y)]"""_SNAME_""""
 +11       DO ^DIR
           IF $DATA(DIRUT)!$DATA(DTOUT)!$DATA(DUOUT)!$DATA(DIROUT)
               QUIT -1
 +12       QUIT $$NAM^RCFN01($PIECE(Y,U))
 +13      ;
ASKSTAT() ; display "which statuses" prompt
 +1       ;
 +2       ; returns selected statuses (comma separated list of internal codes from 340.5/.07) or -1 for no selection / user exit / timeout
 +3       ;
 +4        NEW RES,SEL,STOP,STSTR
 +5        NEW DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 +6        SET STSTR="NCLDFTSP"
 +7        SET DIR(0)="SAO^A:All;N:New;C:Current;L:Late;D:Delinquent;P:Paid in Full;S:Closed;F:Defaulted;T:Terminated;U:Continue;Q:Quit"
 +8        SET DIR("A",1)=""
 +9        SET DIR("A",2)="Statuses available:"
 +10       SET DIR("A",3)="  (A)ll, (N)ew, (C)urrent, (L)ate, (D)elinquent, (P)aid in Full, Clo(S)ed,"
 +11       SET DIR("A",4)="         De(F)aulted, (T)erminated,"
 +12       SET DIR("A",5)=""
 +13       SET DIR("A",6)=""
 +14       SET DIR("A",7)=""
 +15       SET DIR("A")="Select Status to add, Enter to continue or (Q)uit? "
 +16       SET (RES,SEL)=""
           SET STOP=0
           FOR 
               Begin DoDot:1
 +17               IF SEL'=""
                       SET DIR("A",6)="Statuses currently selected: "_SEL
 +18               DO ^DIR
 +19      ;User is ready to enter the days.
                   IF Y=""
                       SET STOP=1
                       QUIT 
 +20      ;User issued exit command, leave utilitystandard time out or ^ escape
                   IF $DATA(DUOUT)!$DATA(DIROUT)
                       SET RES=-1
                       SET STOP=1
                       QUIT 
 +21      ;standard time out or ^ escape
                   IF $DATA(DIRUT)!$DATA(DTOUT)
                       SET STOP=1
                       QUIT 
 +22      ;User selected all available statuses for report
                   IF Y="A"
                       Begin DoDot:2
 +23                       SET RES="1,2,3,4,7,8,5,6"
 +24                       SET SEL="New,Current,Late,Delinquent,Paid in Full,Closed,Defaulted,Terminated"
 +25                       SET STOP=1
                       End DoDot:2
                       QUIT 
 +26               IF Y="Q"
                       SET RES=-1
                       SET STOP=1
                       QUIT 
 +27               IF Y="U"
                       SET STOP=1
                       QUIT 
 +28               IF SEL'[Y(0)
                       Begin DoDot:2
 +29                       SET RES=RES_$SELECT(RES'="":","_($FIND(STSTR,Y)-1),1:$FIND(STSTR,Y)-1)
 +30                       SET SEL=SEL_$SELECT(SEL'="":", "_Y(0),1:Y(0))
 +31                       QUIT 
                       End DoDot:2
 +32      ; all statuses selected - we're done
                   IF $LENGTH(RES,",")=8
                       SET STOP=1
 +33               QUIT 
               End DoDot:1
               if STOP
                   QUIT 
 +34       QUIT $SELECT(RES="":-1,1:RES)
 +35      ;
ASKDAYS() ; display "min. days in status" prompt
 +1       ;
 +2       ; returns min. # of days in status or -1 for no selection / user exit / timeout
 +3       ;
 +4        NEW DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 +5        WRITE !
 +6        SET DIR(0)="NA^0:999:0"
 +7        SET DIR("A")="Enter the Minimum # of Days in Status or ^ to quit: "
 +8        DO ^DIR
           IF $DATA(DIRUT)!$DATA(DTOUT)!$DATA(DUOUT)!$DATA(DIROUT)
               QUIT -1
 +9        QUIT Y
 +10      ;
ASKDAYS1(MINDAYS) ; display "max. days in status" prompt  PRCA*4.5*389
 +1       ;
 +2       ; returns max. # of days in status or -1 for no selection / user exit / timeout
 +3       ;
 +4        NEW DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
 +5        WRITE !
 +6        SET DIR(0)="NAO^"_MINDAYS_":999:0"
 +7        SET DIR("A")="Enter the Maximum # of Days in Status or ^ to quit: "
 +8        DO ^DIR
           IF $DATA(DTOUT)!$DATA(DUOUT)!$DATA(DIROUT)
               QUIT -1
 +9        QUIT Y
 +10      ;
COMPILE   ; compile report
 +1        NEW BEGDT,CNT,ENDDT,NAME,RPIEN,STATDT,STATUS,STLIST,Z
 +2       ;
 +3        SET CNT=0
 +4        IF $PIECE(FILTER,U)="S"
               Begin DoDot:1
 +5       ; filtering by statuses
 +6       ; date to begin the search with
                   SET BEGDT=$$FMADD^XLFDT(DT,-$PIECE(FILTER,U,3),,1)
 +7       ; date to end the search with  PRCA*4.5*389
                   SET Z=$PIECE(FILTER,U,4)
                   SET ENDDT=""
                   IF Z>0
                       SET ENDDT=$$FMADD^XLFDT(DT,-$PIECE(FILTER,U,4),,-1)
 +8                SET STLIST=$PIECE(FILTER,U,2)
                   FOR Z=1:1:$LENGTH(STLIST,",")
                       SET STATUS=$PIECE(STLIST,",",Z)
                       Begin DoDot:2
 +9       ; PRCA*4.5*389
                           SET STATDT=BEGDT
                           FOR 
                               SET STATDT=$ORDER(^RCRP(340.5,"D",STATUS,STATDT),-1)
                               if 'STATDT!(ENDDT'=""&(STATDT<ENDDT))
                                   QUIT 
                               Begin DoDot:3
 +10                               SET RPIEN=""
                                   FOR 
                                       SET RPIEN=$ORDER(^RCRP(340.5,"D",STATUS,STATDT,RPIEN))
                                       if 'RPIEN
                                           QUIT 
                                       SET CNT=CNT+1
                                       DO GETDATA(RPIEN,CNT)
 +11                               QUIT 
                               End DoDot:3
 +12                       QUIT 
                       End DoDot:2
 +13               QUIT 
               End DoDot:1
 +14       IF $PIECE(FILTER,U)="N"!($PIECE(FILTER,U)="U")
               Begin DoDot:1
 +15      ; filtering by name or no filter
 +16               SET Z=""
                   FOR 
                       SET Z=$ORDER(^RCRP(340.5,"B",Z))
                       if 'Z
                           QUIT 
                       Begin DoDot:2
 +17                       SET RPIEN=$ORDER(^RCRP(340.5,"B",Z,""))
                           if 'RPIEN
                               QUIT 
 +18                       IF $PIECE(FILTER,U)="N"
                               SET NAME=$$NAM^RCFN01($PIECE(^RCRP(340.5,RPIEN,0),U,2))
                               if $PIECE(FILTER,U,2)]NAME
                                   QUIT 
                               if NAME]$PIECE(FILTER,U,3)
                                   QUIT 
 +19                       SET CNT=CNT+1
                           DO GETDATA(RPIEN,CNT)
 +20                       QUIT 
                       End DoDot:2
 +21               QUIT 
               End DoDot:1
 +22       DO PRINT
 +23       KILL ^TMP("RCRPSTR",$JOB)
 +24       QUIT 
 +25      ;
GETDATA(RPIEN,CNT) ; fetch data and put it into ^TMP global
 +1       ;
 +2       ; RPIEN - file 340.5 ien
 +3       ; CNT   - sequential # of ^TMP entry to create
 +4       ;
 +5        NEW AMNT,DAYS,DEBTOR,N0,MED,SSN,TMPSTR,Z,ORPLNDT,RMNOPY
 +6        IF RPIEN'>0!(CNT'>0)
               QUIT 
 +7       ; 0-node in file 340.5
           SET N0=^RCRP(340.5,RPIEN,0)
 +8       ; pointer to file 340
           SET DEBTOR=$PIECE(N0,U,2)
 +9       ; Original Plan Date (Creation Date)
           SET ORPLNDT=$PIECE(N0,U,3)
 +10      ; debtor name
           SET NAME=$$NAM^RCFN01(DEBTOR)
           if NAME=""
               QUIT 
 +11      ; non-medical debt  PRCA*4.5*389
           SET MED=1
           IF DEBTOR>0
               IF $PIECE($PIECE(^RCD(340,DEBTOR,0),U),";",2)'="DPT("
                   SET MED=0
 +12      ; debtor SSN
           SET SSN=$$SSN^RCFN01(DEBTOR)
 +13      ; amount owed
           SET AMNT=$$CBAL^RCRPU3(RPIEN,+$PIECE(N0,U,11))
 +14      ; days in status
           SET DAYS=$$FMDIFF^XLFDT(DT,$PIECE(N0,U,8))
 +15      ; remaining # payments
           SET RMNOPY=$$REMPMNTS^RCRPU3(RPIEN,$PIECE(N0,U,6))
 +16      ; each entry is: debtor name ^ ssn ^ repayment plan ID ^ Original Plan Date ^ status (internal) ^ status date ^ days in status ^ last payment date ^ # of payments ^
 +17      ;                remaining balance ^ at CS? ^ # of forbearances ^ medical debt (1/0)
 +18       SET TMPSTR=NAME_U_SSN_U_$PIECE(N0,U)_U_ORPLNDT_U_$PIECE(N0,U,7)_U_$PIECE(N0,U,8)_U_DAYS
 +19      ; last payment date
           SET TMPSTR=TMPSTR_U_$ORDER(^RCRP(340.5,RPIEN,3,"B",""),-1)
 +20       SET TMPSTR=TMPSTR_U_RMNOPY_U_AMNT_U_$PIECE($GET(^RCRP(340.5,RPIEN,1)),U,4)_U_$PIECE(N0,U,9)_U_MED
 +21      ; add a new entry to ^TMP global
 +22       SET ^TMP("RCRPSTR",$JOB,CNT)=TMPSTR
 +23       SET Z=$SELECT(SORT="N":NAME,SORT="S":$$EXTERNAL^DILFD(340.5,.07,,$PIECE(N0,U,7)),1:AMNT)
           if Z=""
               QUIT 
 +24       SET ^TMP("RCRPSTR",$JOB,"IDX",Z,DAYS,CNT)=""
 +25       QUIT 
 +26      ;
PRINT     ; print report
 +1        NEW ATCS,BAL,CNT,DATA,DAYS,EXTDT,LN,NAME,PAGE,SSN,STATUS,Z,Z1,QUIT
 +2        USE IO
 +3        SET PAGE=0
 +4        SET EXTDT=$$FMTE^XLFDT(DT)
 +5        SET QUIT=0
 +6        IF EXCEL
               Begin DoDot:1
 +7       ; PRCA*4.5*389
                   WRITE !,"Repayment Plan Status Report^",EXTDT,U,$$FLTRSTR(),U,$$SORTSTR()
 +8       ; PRCA*4.5*389
                   WRITE !,"Name^SSN^RPP ID^Orig Plan date^Status^Status date^Days in status^Last payment^Current plan length^Remaining balance^CS^Forbearances"
 +9                QUIT 
               End DoDot:1
 +10       IF 'EXCEL
               Begin DoDot:1
 +11               IF $EXTRACT(IOST,1,2)["C-"
                       IF '$DATA(ZTQUEUED)
                           WRITE @IOF
 +12               DO HDR
 +13               QUIT 
               End DoDot:1
 +14       IF '$DATA(^TMP("RCRPSTR",$JOB))
               Begin DoDot:1
 +15               IF EXCEL
                       WRITE !!,"No records found."
                       QUIT 
 +16               WRITE !!,$$CJ^XLFSTR("No records found.",132)
 +17               QUIT 
               End DoDot:1
               QUIT 
 +18       SET Z=""
           FOR 
               SET Z=$ORDER(^TMP("RCRPSTR",$JOB,"IDX",Z))
               if Z=""
                   QUIT 
               Begin DoDot:1
 +19               SET DAYS=""
                   FOR 
                       SET DAYS=$ORDER(^TMP("RCRPSTR",$JOB,"IDX",Z,DAYS),-1)
                       if DAYS=""
                           QUIT 
                       Begin DoDot:2
 +20                       SET CNT=0
                           FOR 
                               SET CNT=$ORDER(^TMP("RCRPSTR",$JOB,"IDX",Z,DAYS,CNT))
                               if 'CNT
                                   QUIT 
                               Begin DoDot:3
 +21      ; PRCA*4.5*389
                                   SET DATA=^TMP("RCRPSTR",$JOB,CNT)
                                   SET NAME=$SELECT($PIECE(DATA,U,13):"",1:"*")_$PIECE(DATA,U)
 +22      ; convert status code
 +23                               SET Z1=$PIECE(DATA,U,5)
                                   SET STATUS=$SELECT(Z1=1:"NEW",Z1=2:"CURR",Z1=3:"LATE",Z1=4:"DELQ",Z1=5:"DEF",Z1=6:"TERM",Z1=7:"CLOS",Z1=8:"PAID",1:"")
 +24      ; format remaining balance
 +25                               SET BAL=$FNUMBER($PIECE(DATA,U,10),"",2)
 +26      ; convert "at CS" value
 +27                               SET ATCS=$SELECT($PIECE(DATA,U,11):"Y",1:"N")
 +28      ; format SSN to last 4 digits
 +29                               SET Z1=$PIECE(DATA,U,2)
                                   SET SSN=$EXTRACT(Z1,$LENGTH(Z1)-3,$LENGTH(Z1))
                                   IF SSN'>0
                                       SET SSN="N/A"
 +30                               IF EXCEL
                                       Begin DoDot:4
 +31      ; PRCA*4.5*389
                                           WRITE !,NAME,U,SSN,U,$PIECE(DATA,U,3),U,$$FMTE^XLFDT($PIECE(DATA,U,4),"2DZ"),U,STATUS,U,$$FMTE^XLFDT($PIECE(DATA,U,6),"2DZ"),U,$PIECE(DATA,U,7),U
 +32      ; 
                                           WRITE $$FMTE^XLFDT($PIECE(DATA,U,8),"2DZ"),U,$PIECE(DATA,U,9),U,BAL,U,ATCS,U,$PIECE(DATA,U,12)
 +33                                       QUIT 
                                       End DoDot:4
                                       QUIT 
 +34                               SET LN=LN+1
 +35      ; PRCA*4.5*389
                                   WRITE !,$EXTRACT(NAME,1,30),?31,SSN,?37,$PIECE(DATA,U,3),?57,$$FMTE^XLFDT($PIECE(DATA,U,4),"2DZ"),?67,STATUS,?73,$$FMTE^XLFDT($PIECE(DATA,U,6),"2DZ"),?83,$PIECE(DATA,U,7),?92
 +36      ; PRCA*4.5*389
                                   WRITE $$FMTE^XLFDT($PIECE(DATA,U,8),"2DZ"),?102,$PIECE(DATA,U,9),?112,$$CJ^XLFSTR("$"_BAL,13),?123,ATCS,?127,$PIECE(DATA,U,12)
 +37                               IF LN>(IOSL-3)
                                       DO HDR
                                       IF $GET(QUIT)
                                           QUIT 
 +38                               QUIT 
                               End DoDot:3
                               if $GET(QUIT)
                                   QUIT 
 +39                       QUIT 
                       End DoDot:2
                       if $GET(QUIT)
                           QUIT 
 +40               QUIT 
               End DoDot:1
               if $GET(QUIT)
                   QUIT 
 +41       IF PAGE>0
               IF '$DATA(ZTQUEUED)
                   DO PAUSE^RCRPRPU
                   WRITE @IOF
 +42       QUIT 
 +43      ;
HDR       ; print header
 +1        IF PAGE>0
               IF '$DATA(ZTQUEUED)
                   DO PAUSE^RCRPU
                   WRITE @IOF
                   IF $GET(QUIT)
                       QUIT 
 +2       ; PRCA*4.5*389
           SET PAGE=PAGE+1
           SET LN=9
 +3        WRITE !,"Repayment Plan Status Report",?66,EXTDT,?120,"Page: ",PAGE
 +4        WRITE !,$$FLTRSTR()
 +5        WRITE !,$$SORTSTR()
 +6       ; PRCA*4.5*389
           WRITE !!,"* Indicates a non-medical debt repayment plan"
 +7        WRITE !!,"                                                                                                                               For-"
 +8        WRITE !,"                                                         Original        Status    Days in   Last     Cur plan  Remaining      bear-"
 +9        WRITE !,"Name                           SSN        RPP ID         Plan Dt   Stat   date     status   payment    length    balance   CS  ances"
 +10       WRITE !
           DO DASH^RCRPRPU(132)
 +11       QUIT 
 +12      ;
FLTRSTR() ; returns "Filtered by" string to print
 +1        NEW STR,Z
 +2        SET STR="Filtered by: "
 +3        IF $PIECE(FILTER,U)="U"
               SET STR=STR_"No filter"
 +4        IF $PIECE(FILTER,U)="N"
               SET STR=STR_"Debtor name (from "_$PIECE(FILTER,U,2)_" to "_$PIECE(FILTER,U,3)_")"
 +5        IF $PIECE(FILTER,U)="S"
               Begin DoDot:1
 +6                SET STR=STR_"Status ("
 +7       ; PRCA*4.5*378
                   FOR Z=1:1:$LENGTH($PIECE(FILTER,U,2),",")
                       SET STR=STR_$SELECT(Z>1:", ",1:"")_$$EXTERNAL^DILFD(340.5,.07,,$PIECE($PIECE(FILTER,U,2),",",Z))
 +8       ; PRCA*4.5*389
                   SET STR=STR_"), "_$SELECT(+$PIECE(FILTER,U,4)>0:"from "_$PIECE(FILTER,U,3)_" to "_$PIECE(FILTER,U,4),1:"at least "_$PIECE(FILTER,U,3))
 +9       ; PRCA*4.5*389
                   SET STR=STR_" days in status"
 +10               QUIT 
               End DoDot:1
 +11       QUIT STR
 +12      ;
SORTSTR() ; returns "Sorted by" string to print
 +1        NEW STR
 +2        SET STR="Sorted by: "_$SELECT(SORT="N":"Debtor name",SORT="S":"Status",1:"Account balance")
 +3        QUIT STR
 +4       ;
 +5       ; Select name range
INTV()    ; Selects the range of names
 +1       ; Output: First value ^ Last Value OR -1 
 +2       ;
 +3        NEW RCFRST,RCLAST,X
 +4       ;
 +5        SET (RCFRST,RCLAST)=""
FRST       WRITE !!?3,"START WITH NAME: FIRST// "
           READ X:DTIME
           IF '$TEST!(X["^")
               QUIT -1
 +1        IF $EXTRACT(X)="?"
               DO HFST(1)
               GOTO FRST
 +2        SET RCFRST=X
LAST       WRITE !?8,"GO TO NAME: LAST// "
           READ X:DTIME
           IF '$TEST!(X["^")
               QUIT -1
 +1        IF $EXTRACT(X)="?"
               DO HFST(2)
               GOTO LAST
 +2        IF X=""
               SET RCLAST="zzzzz"
               GOTO QINT
 +3        IF RCFRST]X
               Begin DoDot:1
 +4                WRITE *7,!!?7,"The LAST value must follow the FIRST.",!
               End DoDot:1
               GOTO LAST
 +5        SET RCLAST=X
 +6       ;
QINT       QUIT (RCFRST_"^"_RCLAST)
 +1       ;
HFST(RCVAL) ; - 'START WITH PATIENT/DEBTOR...' prompt 
 +1        NEW RCPRMPT
 +2        SET RCPRMPT="First"
           if RCVAL=2
               SET RCPRMPT="Last"
 +3       ;
 +4        WRITE !!,"      Enter a valid field value, or"
 +5        WRITE !,"        '<CR>' -  To start from the '"_RCPRMPT_"' value for this field"
 +6        WRITE !,"        '^'    -  To quit this option"
 +7        QUIT