RCHRFS1 ;SLC/SS - High Risk for Suicide Patients Report ; JAN 22,2021@14:32
 ;;4.5;Accounts Receivable;**379**;Mar 20, 1995;Build 16
 ;;Per VA Directive 6402, this routine should not be modified.
 ;
 ;External References  Type       ICR #
 ;-------------------  ---------- -----
 ; EN^DIQ1             Supported  10015
 ; ^DIR                Supported  10026
 ; RX^PSO52API         Supported  4820
 ; $$FMTE^XLFDT        Supported  10103
 ; $$RJ^XLFSTR         Supported  10104
 ; $$STRIP^XLFSTR      Supported  10104
 ;
 ;Access to files
 ;ICR#  TYPE          DESCRIPTION
 ;----- ----------    ---------------------------------------------------------------------------------------------------------------------------------------------
 ; 7218 Private       File (#350), access to fields (#.08),(#.09),(#.1),(#.12),(#.18),(#.19),(#.2),(#12),(#13),(#14)
 ; 4541 Private       File (#350), access to the "C" cross-reference and fields (#.01),(#.02),(#.03),(#.04),(#.05),(#.06),(#.07),(#.11),(#.14),(#.15),(#.16),(#.17)
 ;
 ;Global References    Supported by
 ;-----------------    --------------
 ; ^TMP($J             SACC 2.3.2.5.1
 ;
 ;
 ;Run the report:
 ; RCDFN - DFN of the patient
 ; FRMDTINT - from date
 ; TODTINT - to date
 ; IBSTAT - IB status : 
 ;   1-BILLED,
 ;   2- ON HOLD,
 ;   3- CANCELLED,
 ;   4- BILLED and ON HOLD, 
 ;   5- ALL
 ; IBSVCTYP - type of care
 ;   1 Medical Care
 ;   2 Outpatient Medication
 ;   3 Both (Medical Care and Outpatient Medication)
 ;
RUNRPT(RCDFN,FRMDTINT,TODTINT,IBSTAT,IBSVCTYP) ;Gather data for Report
 D GET350(RCDFN,FRMDTINT,TODTINT,IBSTAT,IBSVCTYP)
 I IBSTAT=5 D GET399^RCHRFS2(RCDFN,FRMDTINT,TODTINT,IBSVCTYP) ; Only pull file #399 data if user selected All as the desired IB Status
 Q
 ;
 ;
 ;Get data from #350
GET350(DFN,FRMDTINT,TODTINT,IBSTAT,IBSVCTYP) ; Collect data originating from the INTEGRATED BILLING ACTION file (#350)
 N IBIEN,IB0,STATLST,CNT,STATLST,LINE,RESULT,IBSTATNM,POP,SVCTYP,BILLNUM
 N DATEINFO,TRIGDT,SVCDT,XTEMP,DIC,DR,DA,DIQ,FBILLNUM,LCNT,LTRFLD,RC430IEN
 N TLTR,IBCANCLR,IBCANCLD,IBCANCLB,ARSTAT,ARAPPR,ARRSC,ARIEN,ARFLDS
 N RXADTNL,NORELDT,RXFILDT,RCHRFSST,STAT350,PTNINFO
 S (RXADTNL,NORELDT,RXFILDT)=""
 S (IBIEN,IBCANCLR,ICANCLD,IBCANCLB)="",CNT=0
 ; STATUS=1-BILLED,2- ON HOLD,3- CANCELLED,4- BILLED and ON HOLD, 5- ALL
 S STATLST=$S(IBSTAT=1:"/3/",IBSTAT=2:"/8/",IBSTAT=3:"/10/",IBSTAT=4:"/3/8/",1:"/3/8/10/")
 S PTNINFO=$$PATINFO^RCHRFSUT(DFN)
 I '$L(PTNINFO) Q  ;something wrong with the patient data
 K ^TMP($J,"RCHRFS",PTNINFO)
 F  S IBIEN=$O(^IB("C",DFN,IBIEN)) Q:IBIEN=""  D
 . K IBFLDS
 . S DIC=350,DR=".01:.07;.08;.09:.12;.14:.2;12:14",DA=IBIEN,DIQ="IBFLDS",DIQ(0)="IE" D EN^DIQ1
 . S STAT350="/"_IBFLDS(350,IBIEN,.05,"I")_"/"
 . S RXADTNL="" ;used only for RX copays in #350 to store additional information to get refill date and indicate whether we have the released date or not
 . S NORELDT=0 ;by default there IS the released date, if there is no released date then  =1
 . S RXFILDT=0 ;to store refill date
 . S DATEINFO=$$GETDTS
 . S RXADTNL=$P(DATEINFO,":",2) ;applies only to RX copays in #350 to store additional information to get refill dates and indicate whether we have the released date or not
 . S DATEINFO=$P(DATEINFO,":") ;the main data
 . I DATEINFO["#" D
 . . S RXDATE=IBFLDS(350,IBIEN,12,"I")
 . . S RXNUM=$E(IBFLDS(350,IBIEN,.08,"E"),1,12)
 . . S RXNAME=""
 . . S DATEINFO="RX/"_"350/"_RXDATE_"/"_RXDATE_"/"_RXNUM_"/"_$E(RXNAME,1,16)
 . S TRIGDT=$P(DATEINFO,"/",3) ;the date that used to compare against the date range and 
 . S SVCDT=$P(DATEINFO,"/",4) ; DOS
 . I DATEINFO["RX/350/" D
 . . S NORELDT=+RXADTNL ;if 1 then there is not release date, so don't display it
 . . S RXFILDT=$P(RXADTNL,U,2) ;fill/ refill date to display 
 . I TRIGDT'<FRMDTINT,TRIGDT'>TODTINT,(STATLST[STAT350) D
 . . ;Check Service Type
 . . S RESULT=IBFLDS(350,IBIEN,.04,"I"),SVCTYP=$P(RESULT,":",1)
 . . I IBSVCTYP=1,(SVCTYP=52!(IBFLDS(350,IBIEN,.03,"E")["RX")) Q  ;Only include Medical
 . . I IBSVCTYP=2,(SVCTYP'=52),(IBFLDS(350,IBIEN,.03,"E")'["RX") Q  ;Only include RX
 . . ;Get Cancellation information if it exists
 . . S IBCANCLR=IBFLDS(350,IBIEN,.1,"E")
 . . S IBCANCLD=IBFLDS(350,IBIEN,14,"I")
 . . S IBCANCLB=IBFLDS(350,IBIEN,13,"E")
 . . ;Get data & Set into scratch global ^TMP($J,"RCHRFS",PTNINFO,BILLNUM,DATE,CNT)=
 . . ;FILE#^IBIEN^REF#^PARENT CHARGE^PARENT EVENT^STATUS^UNITS^TOTAL CHARG^AR BILL NUMBER^CATEGORY
 . . ;MEDICAL DOS^Release RX DT^RX #^RX Name^
 . . ;CNT is used to distinguish entries with the same Bill Number
 . . S (CNT,ARIEN)=0
 . . S FBILLNUM=IBFLDS(350,IBIEN,.11,"I") I FBILLNUM="" S BILLNUM=0
 . . I FBILLNUM["-" S BILLNUM=$P(FBILLNUM,"-",2)
 . . I BILLNUM'="" S ARIEN=$O(^PRCA(430,"D",BILLNUM,"")) ;Get IEN to 430 based on bill number
 . . S (ARSTAT,ARAPPR,ARRSC)=""
 . . I BILLNUM'="",$G(ARIEN)'=""  D
 . . . S DIC=430,DR="8;203;255.1",DA=ARIEN,DIQ="ARFLDS",DIQ(0)="IE" D EN^DIQ1
 . . . S ARSTAT=$G(ARFLDS(430,ARIEN,8,"E")) ; AR Status
 . . . S ARAPPR=$G(ARFLDS(430,ARIEN,203,"E")) ; APPR
 . . . I ARAPPR="" S ARAPPR="RVW"
 . . . S ARRSC=$G(ARFLDS(430,ARIEN,255.1,"I")) ; RSC
 . . . I ARRSC="" S ARRSC="RVW"
 . . S IBSTATNM=IBFLDS(350,IBIEN,.05,"E")
 . . I $D(^TMP($J,"RCHRFS",PTNINFO,BILLNUM,SVCDT)) S CNT="" S CNT=$O(^TMP($J,"RCHRFS",PTNINFO,BILLNUM,SVCDT,CNT),-1)+1
 . . S XTEMP=350_U_IBIEN_U_IBFLDS(350,IBIEN,.01,"E") ; Pos 1-3 FILE^IBIEN^IB Ref #
 . . S XTEMP=XTEMP_U_IBFLDS(350,IBIEN,.09,"E") ;Pos 4 Parent Charge 
 . . S XTEMP=XTEMP_U_IBFLDS(350,IBIEN,.16,"E") ;Pos 5 Parent Event
 . . S XTEMP=XTEMP_U_IBSTATNM_U_IBFLDS(350,IBIEN,.06,"E") ;Pos 6 IB STATUS Pos 7 Units Col 11&6
 . . S XTEMP=XTEMP_U_IBFLDS(350,IBIEN,.07,"E") ;Pos 8 Total Charge Col 5
 . . S XTEMP=XTEMP_U_$E(BILLNUM,1,21) ;Pos 9 AR Bill # Col 3
 . . S XTEMP=XTEMP_U_$E(IBFLDS(350,IBIEN,.03,"E"),1,26) ;Pos 10 Category Col 4
 . . I SVCTYP'=52 D
 . . . I IBFLDS(350,IBIEN,.03,"E")["RX" S XTEMP=XTEMP_U_U_$$STRIP^XLFSTR($$FMTE^XLFDT(SVCDT,"8D")," ")_U_U ;Pos 11 blank Pos 12 Release RX Date Col 7&8
 . . . I IBFLDS(350,IBIEN,.03,"E")'["RX" S XTEMP=XTEMP_U_$$STRIP^XLFSTR($$FMTE^XLFDT(SVCDT,"8D")," ")_U_U_U ;Pos 11  Medical DOS Pos 12-14 blank Col 7,8,9,10
 . . I SVCTYP=52 D
 . . . S XTEMP=XTEMP_U_U_$$STRIP^XLFSTR($$FMTE^XLFDT(SVCDT,"8D")," ") ;Pos 11 blank Pos 12 Release RX Date Col 7&8
 . . . S XTEMP=XTEMP_U_$P(DATEINFO,"/",5)_U_$P(DATEINFO,"/",6) ;Pos 13 RX Number, Pos 14 RX Name Col 9&10
 . . S XTEMP=XTEMP_U_$E($G(ARSTAT),1,21) ;Pos 15 AR Status Col 12
 . . S XTEMP=XTEMP_U I $G(IBCANCLR)'="" S XTEMP=XTEMP_$$STRIP^XLFSTR($$FMTE^XLFDT($G(IBCANCLD),"8D")," ") ;Pos 16 Cancel Dt
 . . S XTEMP=XTEMP_U I $G(IBCANCLR)'="" S XTEMP=XTEMP_$E($G(IBCANCLR),1,14) ;Pos 17 Cancel Reason
 . . S XTEMP=XTEMP_U I $G(IBCANCLR)'="" S XTEMP=XTEMP_$E(IBCANCLB,1,16) ;Pos 18 Cancel By
 . . S XTEMP=XTEMP_U_$G(ARAPPR) ;Pos 19 APPR
 . . S XTEMP=XTEMP_U_$G(ARRSC) ;Pos 20 RSC
 . . ;Get Letter dates if they exist
 . . I FBILLNUM D
 . . . I '$D(^PRCA(430,"B",FBILLNUM)) Q
 . . . S RC430IEN=$O(^PRCA(430,"B",FBILLNUM,""))
 . . . K ARFLDS
 . . . S DIC=430,DR="61:63;68",DA=RC430IEN,DIQ="ARFLDS",DIQ(0)="I" D EN^DIQ1
 . . . S LCNT=0
 . . . F LTRFLD=61,62,63,68 D
 . . . . S LCNT=LCNT+1 S TLTR="LTR"_LCNT
 . . . . S @TLTR=ARFLDS(430,RC430IEN,LTRFLD,"I")
 . . . . I @TLTR'="" S XTEMP=XTEMP_U_$$STRIP^XLFSTR($$FMTE^XLFDT(@TLTR,"8D")," ") ; Pos 21-24 Letter 1-4
 . . . . I @TLTR="" S XTEMP=XTEMP_U_"NO DATE" ; Pos 21-24 Letter 1-4
 . . ;add HRfS information
 . . S RCHRFSST=$$HRFSDTS^RCHRFSUT(DFN,SVCDT)
 . . S $P(XTEMP,U,27)=$P(RCHRFSST,U,2) ;HRfS Activation Date 16
 . . S $P(XTEMP,U,28)=$P(RCHRFSST,U,3) ;HRfS Inactivation Date 18
 . . S $P(XTEMP,U,29)=$P(RCHRFSST,U,1) ;HRfS Active On DOS 11
 . . I SVCTYP=52 D
 . . . I NORELDT>0 S $P(XTEMP,U,12)=""
 . . . I RXFILDT>0 S $P(XTEMP,U,30)=RXFILDT
 . . S ^TMP($J,"RCHRFS",PTNINFO,BILLNUM,SVCDT,CNT)=XTEMP
 . . K XTEMP
 Q
 ;
 ;Loop through ^TMP to write report lines.
OUTPRPT ; Loop through ^TMP to write report lines.
 N LINE,BILLNUM,CNT,JUNK,PTNINFO
 S CNT=0,POP=0,LINE="",BILLNUM="",JUNK=0
 I '$D(^TMP($J,"RCHRFS")) S POP=1 W !,"NO DATA FOUND" Q
 S PTNINFO=""
 F  S PTNINFO=$O(^TMP($J,"RCHRFS",PTNINFO)) Q:PTNINFO=""!POP  D  Q:IBQUIT
 .F  S BILLNUM=$O(^TMP($J,"RCHRFS",PTNINFO,BILLNUM)) Q:BILLNUM=""!POP  D  Q:IBQUIT
 .. S SVCDT="" F  S SVCDT=$O(^TMP($J,"RCHRFS",PTNINFO,BILLNUM,SVCDT)) Q:SVCDT=""!POP  D  Q:IBQUIT
 ... S CNT="" F  S CNT=$O(^TMP($J,"RCHRFS",PTNINFO,BILLNUM,SVCDT,CNT)) Q:CNT=""  D  Q:IBQUIT
 .... I $Y>(IOSL-4) W ! D PAUSE(.IBQUIT) Q:IBQUIT  W @IOF D COLHEAD^RCHRFS
 .... S LINE=^TMP($J,"RCHRFS",PTNINFO,BILLNUM,SVCDT,CNT)
 .... I $P(LINE,U,9)=0 S $P(LINE,U,9)=""
 .... I '$P(LINE,U,4) D WRITEREC(PTNINFO,LINE)
 .... I $P(LINE,U,4)=$P(LINE,U,3),($P(LINE,U,3)'="") D WRITEREC(PTNINFO,LINE)
 K ^TMP($J,"RCHRFS")
 Q
 ;
 ;Write one line of the report
WRITEREC(PTNINFO,LINE) ; Write one line of report
 N PATNM,RCSSN
 S PATNM=$P(PTNINFO,U,1)
 S RCSSN=$P(PTNINFO,U,2)
 W !,$E(PATNM,1,26) ;Veteran Name, length: 26
 W ?26,U,RCSSN ;SSN 9
 W ?36,U,$P(LINE,U,27) ;HRfS Activation Date 16
 W ?53,U,$P(LINE,U,28) ;HRfS Inactivation Date 18
 W ?72,U,$P(LINE,U,29) ;HRfS Active On DOS 11
 W ?84,U,$P(LINE,U,9) ;Bill Number 11
 W ?96,U,$P(LINE,U,10) ;Category 26
 W ?123,U,$P(LINE,U,11) ;Medical DOS 11
 W ?135,U,$$STRIP^XLFSTR($$FMTE^XLFDT($P(LINE,U,30),"8D")," ") ;Rx Fill Date 12   
 W ?148,U,$P(LINE,U,12) ;Rx Release Date 15
 W ?164,U,$P(LINE,U,13) ;Rx Number 12
 W ?177,U,$E($P(LINE,U,14),1,16) ;Rx Name 16
 W ?194,U,$$RJ^XLFSTR($J($P(LINE,U,8),8,2),11) ;Charge Amount 11
 W ?206,U,$P(LINE,U,7) ;Unit 4
 W ?211,U,$P(LINE,U,6) ;IB STATUS 13
 W ?225,U,$P(LINE,U,15) ;AR STATUS 21
 Q
 ;
 ;Get dates for #350 entries
GETDTS() ; Get appropriate selection trigger dates by type of service
 ;Determine transaction type 52, RX Manual RX Out pat, inpatient, LTC inpatient, LTC Outpatient
 ;based on transaction type get date used for selection and determine if it falls within the 
 ;date range for the report.
 ; Return: Transaction type/File derived from/SELDT (Selection date)/DISPDT (display date).
 ; in the case of RX the following is appended to the return /RX #/Drug Name
 N IBTYPINT,IBTYPE,IBTYPE,IBBG,DATES,RESPONSE,SVCTYP,RXFLDS,RXRFILL,RXNUM,RXNAME,IBCAT,IBDTENT
 N RXDATE,RXIEN,RXNODE,IBDTFRM,RXFILDT,NORELDT
 S RESPONSE="",RXRFILL="",IBCAT="",IBDTFRM="",IBDTENT="",NORELDT=0
 ;RX via pharmacy system
 S IBCAT=IBFLDS(350,IBIEN,.03,"E")
 S IBTYPE=IBFLDS(350,IBIEN,.04,"E") S SVCTYP=+IBTYPE
 I SVCTYP=52 D  ;RX
 . ;get refill # if available and store it in RXRFILL
 . I $P(IBTYPE,";",2)'="" S RXRFILL=$P(IBTYPE,":",3)
 . K ^TMP($J,"RXRDT")
 . S RXIEN=+$P(IBTYPE,":",2)
 . S RXNODE="0,2"
 . I RXRFILL'="" S RXNODE="0,2,R^^"_RXRFILL
 . D RX^PSO52API(DFN,"RXRDT",RXIEN,,RXNODE,,)
 . I +$G(^TMP($J,"RXRDT",RXIEN,0))=-1 S RESPONSE="RX/"_"350#"_$P(^TMP($J,"RXRDT",RXIEN,0),U,2) Q
 . I RESPONSE'="" Q
 . I RXRFILL'="",$P(^TMP($J,"RXRDT",DFN,RXIEN,"RF",0),U,1)=-1 Q  ;No data for refill
 . ;get the release date if this is a refill (RXRFILL'="") 
 . I RXRFILL'="" S RXDATE=$P($G(^TMP($J,"RXRDT",DFN,RXIEN,"RF",RXRFILL,17)),U,1)
 . ;and if it is the original fill
 . E  S RXDATE=$P($G(^TMP($J,"RXRDT",DFN,RXIEN,31)),U,1)
 . ;get the fill date if this is a refill (RXRFILL'="") 
 . I RXRFILL'="" S RXFILDT=$P($G(^TMP($J,"RXRDT",DFN,RXIEN,"RF",RXRFILL,0.01)),U,1)
 . ;and if it is the original fill
 . E  S RXFILDT=+$P($G(^TMP($J,"RXRDT",DFN,RXIEN,22)),U,1)
 . ;
 . ;if no release date then use the refill date instead
 . I 'RXDATE,RXFILDT S RXDATE=RXFILDT,NORELDT=1 ;NORELDT=1 indicates that release date does not exist. Note: we set RXDATE=RXFILDT only for the inclusion logic, that compares release date with the selected date range
 . S RXDATE=RXDATE\1
 . S RXNUM=^TMP($J,"RXRDT",DFN,RXIEN,.01)
 . S RXNAME=$P(^TMP($J,"RXRDT",DFN,RXIEN,6),U,2)
 . S RESPONSE="RX/"_"350/"_RXDATE_"/"_RXDATE_"/"_RXNUM_"/"_$E(RXNAME,1,16)_":"_NORELDT_U_RXFILDT
 I RESPONSE'="" Q RESPONSE
 ;Manually entered RX
 I SVCTYP=350 D
 . I IBCAT'["RX" Q  ; Medical Charge
 . S IBDTENT=IBFLDS(350,IBIEN,.15,"I")
 . I IBDTENT="" S IBDTENT=IBFLDS(350,IBIEN,12,"I")
 . S IBDTFRM=IBFLDS(350,IBIEN,.14,"I")
 . I IBDTFRM="" S IBDTFRM=IBDTENT
 . S RESPONSE="RXM/"_"350/"_IBDTENT_"/"_IBDTFRM
 I RESPONSE'="" Q RESPONSE
 ;Inpatient or LTC Inpatient
 I IBCAT["INPT"!(IBCAT["ADMISSION") D
 . ;INP/350/(#.14) DATE BILLED FROM - used as trigger date to compare against the date range/(#.14) DATE BILLED FROM - used as DOS
 . S RESPONSE="INP/"_"350/"_IBFLDS(350,IBIEN,.14,"I")_"/"_IBFLDS(350,IBIEN,.14,"I")
 I RESPONSE'="" Q RESPONSE
 ;All Outpatient except for LTC
 S RESPONSE="OPT/350/"_IBFLDS(350,IBIEN,.14,"I")_"/"_IBFLDS(350,IBIEN,.14,"I")
 Q RESPONSE
 ;
PAUSE(IBQUIT) ;
 I $G(RCPAGE)>0,TRM K DIR S DIR(0)="E" D ^DIR K DIR S:+Y=0 IBQUIT=1
 Q
 ;
CLEAN ; KILL ALL REMAINING VARIABLES BEFORE EXIT
 K ^TMP($J,"RXRDT")
 K RXFLDS,IBFLDS,TRIGDT,DPTDFN,IBRXFILL,IBRXNAM,IBRXNUM,ICANCLD,LTR1,LTR2,LTR3,LTR4,VADM
 K ARSTAT,ARAPPR,ARRSC
 Q
 ;
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HRCHRFS1   13184     printed  Sep 23, 2025@19:23:09                                                                                                                                                                                                    Page 2
RCHRFS1   ;SLC/SS - High Risk for Suicide Patients Report ; JAN 22,2021@14:32
 +1       ;;4.5;Accounts Receivable;**379**;Mar 20, 1995;Build 16
 +2       ;;Per VA Directive 6402, this routine should not be modified.
 +3       ;
 +4       ;External References  Type       ICR #
 +5       ;-------------------  ---------- -----
 +6       ; EN^DIQ1             Supported  10015
 +7       ; ^DIR                Supported  10026
 +8       ; RX^PSO52API         Supported  4820
 +9       ; $$FMTE^XLFDT        Supported  10103
 +10      ; $$RJ^XLFSTR         Supported  10104
 +11      ; $$STRIP^XLFSTR      Supported  10104
 +12      ;
 +13      ;Access to files
 +14      ;ICR#  TYPE          DESCRIPTION
 +15      ;----- ----------    ---------------------------------------------------------------------------------------------------------------------------------------------
 +16      ; 7218 Private       File (#350), access to fields (#.08),(#.09),(#.1),(#.12),(#.18),(#.19),(#.2),(#12),(#13),(#14)
 +17      ; 4541 Private       File (#350), access to the "C" cross-reference and fields (#.01),(#.02),(#.03),(#.04),(#.05),(#.06),(#.07),(#.11),(#.14),(#.15),(#.16),(#.17)
 +18      ;
 +19      ;Global References    Supported by
 +20      ;-----------------    --------------
 +21      ; ^TMP($J             SACC 2.3.2.5.1
 +22      ;
 +23      ;
 +24      ;Run the report:
 +25      ; RCDFN - DFN of the patient
 +26      ; FRMDTINT - from date
 +27      ; TODTINT - to date
 +28      ; IBSTAT - IB status : 
 +29      ;   1-BILLED,
 +30      ;   2- ON HOLD,
 +31      ;   3- CANCELLED,
 +32      ;   4- BILLED and ON HOLD, 
 +33      ;   5- ALL
 +34      ; IBSVCTYP - type of care
 +35      ;   1 Medical Care
 +36      ;   2 Outpatient Medication
 +37      ;   3 Both (Medical Care and Outpatient Medication)
 +38      ;
RUNRPT(RCDFN,FRMDTINT,TODTINT,IBSTAT,IBSVCTYP) ;Gather data for Report
 +1        DO GET350(RCDFN,FRMDTINT,TODTINT,IBSTAT,IBSVCTYP)
 +2       ; Only pull file #399 data if user selected All as the desired IB Status
           IF IBSTAT=5
               DO GET399^RCHRFS2(RCDFN,FRMDTINT,TODTINT,IBSVCTYP)
 +3        QUIT 
 +4       ;
 +5       ;
 +6       ;Get data from #350
GET350(DFN,FRMDTINT,TODTINT,IBSTAT,IBSVCTYP) ; Collect data originating from the INTEGRATED BILLING ACTION file (#350)
 +1        NEW IBIEN,IB0,STATLST,CNT,STATLST,LINE,RESULT,IBSTATNM,POP,SVCTYP,BILLNUM
 +2        NEW DATEINFO,TRIGDT,SVCDT,XTEMP,DIC,DR,DA,DIQ,FBILLNUM,LCNT,LTRFLD,RC430IEN
 +3        NEW TLTR,IBCANCLR,IBCANCLD,IBCANCLB,ARSTAT,ARAPPR,ARRSC,ARIEN,ARFLDS
 +4        NEW RXADTNL,NORELDT,RXFILDT,RCHRFSST,STAT350,PTNINFO
 +5        SET (RXADTNL,NORELDT,RXFILDT)=""
 +6        SET (IBIEN,IBCANCLR,ICANCLD,IBCANCLB)=""
           SET CNT=0
 +7       ; STATUS=1-BILLED,2- ON HOLD,3- CANCELLED,4- BILLED and ON HOLD, 5- ALL
 +8        SET STATLST=$SELECT(IBSTAT=1:"/3/",IBSTAT=2:"/8/",IBSTAT=3:"/10/",IBSTAT=4:"/3/8/",1:"/3/8/10/")
 +9        SET PTNINFO=$$PATINFO^RCHRFSUT(DFN)
 +10      ;something wrong with the patient data
           IF '$LENGTH(PTNINFO)
               QUIT 
 +11       KILL ^TMP($JOB,"RCHRFS",PTNINFO)
 +12       FOR 
               SET IBIEN=$ORDER(^IB("C",DFN,IBIEN))
               if IBIEN=""
                   QUIT 
               Begin DoDot:1
 +13               KILL IBFLDS
 +14               SET DIC=350
                   SET DR=".01:.07;.08;.09:.12;.14:.2;12:14"
                   SET DA=IBIEN
                   SET DIQ="IBFLDS"
                   SET DIQ(0)="IE"
                   DO EN^DIQ1
 +15               SET STAT350="/"_IBFLDS(350,IBIEN,.05,"I")_"/"
 +16      ;used only for RX copays in #350 to store additional information to get refill date and indicate whether we have the released date or not
                   SET RXADTNL=""
 +17      ;by default there IS the released date, if there is no released date then  =1
                   SET NORELDT=0
 +18      ;to store refill date
                   SET RXFILDT=0
 +19               SET DATEINFO=$$GETDTS
 +20      ;applies only to RX copays in #350 to store additional information to get refill dates and indicate whether we have the released date or not
                   SET RXADTNL=$PIECE(DATEINFO,":",2)
 +21      ;the main data
                   SET DATEINFO=$PIECE(DATEINFO,":")
 +22               IF DATEINFO["#"
                       Begin DoDot:2
 +23                       SET RXDATE=IBFLDS(350,IBIEN,12,"I")
 +24                       SET RXNUM=$EXTRACT(IBFLDS(350,IBIEN,.08,"E"),1,12)
 +25                       SET RXNAME=""
 +26                       SET DATEINFO="RX/"_"350/"_RXDATE_"/"_RXDATE_"/"_RXNUM_"/"_$EXTRACT(RXNAME,1,16)
                       End DoDot:2
 +27      ;the date that used to compare against the date range and 
                   SET TRIGDT=$PIECE(DATEINFO,"/",3)
 +28      ; DOS
                   SET SVCDT=$PIECE(DATEINFO,"/",4)
 +29               IF DATEINFO["RX/350/"
                       Begin DoDot:2
 +30      ;if 1 then there is not release date, so don't display it
                           SET NORELDT=+RXADTNL
 +31      ;fill/ refill date to display 
                           SET RXFILDT=$PIECE(RXADTNL,U,2)
                       End DoDot:2
 +32               IF TRIGDT'<FRMDTINT
                       IF TRIGDT'>TODTINT
                           IF (STATLST[STAT350)
                               Begin DoDot:2
 +33      ;Check Service Type
 +34                               SET RESULT=IBFLDS(350,IBIEN,.04,"I")
                                   SET SVCTYP=$PIECE(RESULT,":",1)
 +35      ;Only include Medical
                                   IF IBSVCTYP=1
                                       IF (SVCTYP=52!(IBFLDS(350,IBIEN,.03,"E")["RX"))
                                           QUIT 
 +36      ;Only include RX
                                   IF IBSVCTYP=2
                                       IF (SVCTYP'=52)
                                           IF (IBFLDS(350,IBIEN,.03,"E")'["RX")
                                               QUIT 
 +37      ;Get Cancellation information if it exists
 +38                               SET IBCANCLR=IBFLDS(350,IBIEN,.1,"E")
 +39                               SET IBCANCLD=IBFLDS(350,IBIEN,14,"I")
 +40                               SET IBCANCLB=IBFLDS(350,IBIEN,13,"E")
 +41      ;Get data & Set into scratch global ^TMP($J,"RCHRFS",PTNINFO,BILLNUM,DATE,CNT)=
 +42      ;FILE#^IBIEN^REF#^PARENT CHARGE^PARENT EVENT^STATUS^UNITS^TOTAL CHARG^AR BILL NUMBER^CATEGORY
 +43      ;MEDICAL DOS^Release RX DT^RX #^RX Name^
 +44      ;CNT is used to distinguish entries with the same Bill Number
 +45                               SET (CNT,ARIEN)=0
 +46                               SET FBILLNUM=IBFLDS(350,IBIEN,.11,"I")
                                   IF FBILLNUM=""
                                       SET BILLNUM=0
 +47                               IF FBILLNUM["-"
                                       SET BILLNUM=$PIECE(FBILLNUM,"-",2)
 +48      ;Get IEN to 430 based on bill number
                                   IF BILLNUM'=""
                                       SET ARIEN=$ORDER(^PRCA(430,"D",BILLNUM,""))
 +49                               SET (ARSTAT,ARAPPR,ARRSC)=""
 +50                               IF BILLNUM'=""
                                       IF $GET(ARIEN)'=""
                                           Begin DoDot:3
 +51                                           SET DIC=430
                                               SET DR="8;203;255.1"
                                               SET DA=ARIEN
                                               SET DIQ="ARFLDS"
                                               SET DIQ(0)="IE"
                                               DO EN^DIQ1
 +52      ; AR Status
                                               SET ARSTAT=$GET(ARFLDS(430,ARIEN,8,"E"))
 +53      ; APPR
                                               SET ARAPPR=$GET(ARFLDS(430,ARIEN,203,"E"))
 +54                                           IF ARAPPR=""
                                                   SET ARAPPR="RVW"
 +55      ; RSC
                                               SET ARRSC=$GET(ARFLDS(430,ARIEN,255.1,"I"))
 +56                                           IF ARRSC=""
                                                   SET ARRSC="RVW"
                                           End DoDot:3
 +57                               SET IBSTATNM=IBFLDS(350,IBIEN,.05,"E")
 +58                               IF $DATA(^TMP($JOB,"RCHRFS",PTNINFO,BILLNUM,SVCDT))
                                       SET CNT=""
                                       SET CNT=$ORDER(^TMP($JOB,"RCHRFS",PTNINFO,BILLNUM,SVCDT,CNT),-1)+1
 +59      ; Pos 1-3 FILE^IBIEN^IB Ref #
                                   SET XTEMP=350_U_IBIEN_U_IBFLDS(350,IBIEN,.01,"E")
 +60      ;Pos 4 Parent Charge 
                                   SET XTEMP=XTEMP_U_IBFLDS(350,IBIEN,.09,"E")
 +61      ;Pos 5 Parent Event
                                   SET XTEMP=XTEMP_U_IBFLDS(350,IBIEN,.16,"E")
 +62      ;Pos 6 IB STATUS Pos 7 Units Col 11&6
                                   SET XTEMP=XTEMP_U_IBSTATNM_U_IBFLDS(350,IBIEN,.06,"E")
 +63      ;Pos 8 Total Charge Col 5
                                   SET XTEMP=XTEMP_U_IBFLDS(350,IBIEN,.07,"E")
 +64      ;Pos 9 AR Bill # Col 3
                                   SET XTEMP=XTEMP_U_$EXTRACT(BILLNUM,1,21)
 +65      ;Pos 10 Category Col 4
                                   SET XTEMP=XTEMP_U_$EXTRACT(IBFLDS(350,IBIEN,.03,"E"),1,26)
 +66                               IF SVCTYP'=52
                                       Begin DoDot:3
 +67      ;Pos 11 blank Pos 12 Release RX Date Col 7&8
                                           IF IBFLDS(350,IBIEN,.03,"E")["RX"
                                               SET XTEMP=XTEMP_U_U_$$STRIP^XLFSTR($$FMTE^XLFDT(SVCDT,"8D")," ")_U_U
 +68      ;Pos 11  Medical DOS Pos 12-14 blank Col 7,8,9,10
                                           IF IBFLDS(350,IBIEN,.03,"E")'["RX"
                                               SET XTEMP=XTEMP_U_$$STRIP^XLFSTR($$FMTE^XLFDT(SVCDT,"8D")," ")_U_U_U
                                       End DoDot:3
 +69                               IF SVCTYP=52
                                       Begin DoDot:3
 +70      ;Pos 11 blank Pos 12 Release RX Date Col 7&8
                                           SET XTEMP=XTEMP_U_U_$$STRIP^XLFSTR($$FMTE^XLFDT(SVCDT,"8D")," ")
 +71      ;Pos 13 RX Number, Pos 14 RX Name Col 9&10
                                           SET XTEMP=XTEMP_U_$PIECE(DATEINFO,"/",5)_U_$PIECE(DATEINFO,"/",6)
                                       End DoDot:3
 +72      ;Pos 15 AR Status Col 12
                                   SET XTEMP=XTEMP_U_$EXTRACT($GET(ARSTAT),1,21)
 +73      ;Pos 16 Cancel Dt
                                   SET XTEMP=XTEMP_U
                                   IF $GET(IBCANCLR)'=""
                                       SET XTEMP=XTEMP_$$STRIP^XLFSTR($$FMTE^XLFDT($GET(IBCANCLD),"8D")," ")
 +74      ;Pos 17 Cancel Reason
                                   SET XTEMP=XTEMP_U
                                   IF $GET(IBCANCLR)'=""
                                       SET XTEMP=XTEMP_$EXTRACT($GET(IBCANCLR),1,14)
 +75      ;Pos 18 Cancel By
                                   SET XTEMP=XTEMP_U
                                   IF $GET(IBCANCLR)'=""
                                       SET XTEMP=XTEMP_$EXTRACT(IBCANCLB,1,16)
 +76      ;Pos 19 APPR
                                   SET XTEMP=XTEMP_U_$GET(ARAPPR)
 +77      ;Pos 20 RSC
                                   SET XTEMP=XTEMP_U_$GET(ARRSC)
 +78      ;Get Letter dates if they exist
 +79                               IF FBILLNUM
                                       Begin DoDot:3
 +80                                       IF '$DATA(^PRCA(430,"B",FBILLNUM))
                                               QUIT 
 +81                                       SET RC430IEN=$ORDER(^PRCA(430,"B",FBILLNUM,""))
 +82                                       KILL ARFLDS
 +83                                       SET DIC=430
                                           SET DR="61:63;68"
                                           SET DA=RC430IEN
                                           SET DIQ="ARFLDS"
                                           SET DIQ(0)="I"
                                           DO EN^DIQ1
 +84                                       SET LCNT=0
 +85                                       FOR LTRFLD=61,62,63,68
                                               Begin DoDot:4
 +86                                               SET LCNT=LCNT+1
                                                   SET TLTR="LTR"_LCNT
 +87                                               SET @TLTR=ARFLDS(430,RC430IEN,LTRFLD,"I")
 +88      ; Pos 21-24 Letter 1-4
                                                   IF @TLTR'=""
                                                       SET XTEMP=XTEMP_U_$$STRIP^XLFSTR($$FMTE^XLFDT(@TLTR,"8D")," ")
 +89      ; Pos 21-24 Letter 1-4
                                                   IF @TLTR=""
                                                       SET XTEMP=XTEMP_U_"NO DATE"
                                               End DoDot:4
                                       End DoDot:3
 +90      ;add HRfS information
 +91                               SET RCHRFSST=$$HRFSDTS^RCHRFSUT(DFN,SVCDT)
 +92      ;HRfS Activation Date 16
                                   SET $PIECE(XTEMP,U,27)=$PIECE(RCHRFSST,U,2)
 +93      ;HRfS Inactivation Date 18
                                   SET $PIECE(XTEMP,U,28)=$PIECE(RCHRFSST,U,3)
 +94      ;HRfS Active On DOS 11
                                   SET $PIECE(XTEMP,U,29)=$PIECE(RCHRFSST,U,1)
 +95                               IF SVCTYP=52
                                       Begin DoDot:3
 +96                                       IF NORELDT>0
                                               SET $PIECE(XTEMP,U,12)=""
 +97                                       IF RXFILDT>0
                                               SET $PIECE(XTEMP,U,30)=RXFILDT
                                       End DoDot:3
 +98                               SET ^TMP($JOB,"RCHRFS",PTNINFO,BILLNUM,SVCDT,CNT)=XTEMP
 +99                               KILL XTEMP
                               End DoDot:2
               End DoDot:1
 +100      QUIT 
 +101     ;
 +102     ;Loop through ^TMP to write report lines.
OUTPRPT   ; Loop through ^TMP to write report lines.
 +1        NEW LINE,BILLNUM,CNT,JUNK,PTNINFO
 +2        SET CNT=0
           SET POP=0
           SET LINE=""
           SET BILLNUM=""
           SET JUNK=0
 +3        IF '$DATA(^TMP($JOB,"RCHRFS"))
               SET POP=1
               WRITE !,"NO DATA FOUND"
               QUIT 
 +4        SET PTNINFO=""
 +5        FOR 
               SET PTNINFO=$ORDER(^TMP($JOB,"RCHRFS",PTNINFO))
               if PTNINFO=""!POP
                   QUIT 
               Begin DoDot:1
 +6                FOR 
                       SET BILLNUM=$ORDER(^TMP($JOB,"RCHRFS",PTNINFO,BILLNUM))
                       if BILLNUM=""!POP
                           QUIT 
                       Begin DoDot:2
 +7                        SET SVCDT=""
                           FOR 
                               SET SVCDT=$ORDER(^TMP($JOB,"RCHRFS",PTNINFO,BILLNUM,SVCDT))
                               if SVCDT=""!POP
                                   QUIT 
                               Begin DoDot:3
 +8                                SET CNT=""
                                   FOR 
                                       SET CNT=$ORDER(^TMP($JOB,"RCHRFS",PTNINFO,BILLNUM,SVCDT,CNT))
                                       if CNT=""
                                           QUIT 
                                       Begin DoDot:4
 +9                                        IF $Y>(IOSL-4)
                                               WRITE !
                                               DO PAUSE(.IBQUIT)
                                               if IBQUIT
                                                   QUIT 
                                               WRITE @IOF
                                               DO COLHEAD^RCHRFS
 +10                                       SET LINE=^TMP($JOB,"RCHRFS",PTNINFO,BILLNUM,SVCDT,CNT)
 +11                                       IF $PIECE(LINE,U,9)=0
                                               SET $PIECE(LINE,U,9)=""
 +12                                       IF '$PIECE(LINE,U,4)
                                               DO WRITEREC(PTNINFO,LINE)
 +13                                       IF $PIECE(LINE,U,4)=$PIECE(LINE,U,3)
                                               IF ($PIECE(LINE,U,3)'="")
                                                   DO WRITEREC(PTNINFO,LINE)
                                       End DoDot:4
                                       if IBQUIT
                                           QUIT 
                               End DoDot:3
                               if IBQUIT
                                   QUIT 
                       End DoDot:2
                       if IBQUIT
                           QUIT 
               End DoDot:1
               if IBQUIT
                   QUIT 
 +14       KILL ^TMP($JOB,"RCHRFS")
 +15       QUIT 
 +16      ;
 +17      ;Write one line of the report
WRITEREC(PTNINFO,LINE) ; Write one line of report
 +1        NEW PATNM,RCSSN
 +2        SET PATNM=$PIECE(PTNINFO,U,1)
 +3        SET RCSSN=$PIECE(PTNINFO,U,2)
 +4       ;Veteran Name, length: 26
           WRITE !,$EXTRACT(PATNM,1,26)
 +5       ;SSN 9
           WRITE ?26,U,RCSSN
 +6       ;HRfS Activation Date 16
           WRITE ?36,U,$PIECE(LINE,U,27)
 +7       ;HRfS Inactivation Date 18
           WRITE ?53,U,$PIECE(LINE,U,28)
 +8       ;HRfS Active On DOS 11
           WRITE ?72,U,$PIECE(LINE,U,29)
 +9       ;Bill Number 11
           WRITE ?84,U,$PIECE(LINE,U,9)
 +10      ;Category 26
           WRITE ?96,U,$PIECE(LINE,U,10)
 +11      ;Medical DOS 11
           WRITE ?123,U,$PIECE(LINE,U,11)
 +12      ;Rx Fill Date 12   
           WRITE ?135,U,$$STRIP^XLFSTR($$FMTE^XLFDT($PIECE(LINE,U,30),"8D")," ")
 +13      ;Rx Release Date 15
           WRITE ?148,U,$PIECE(LINE,U,12)
 +14      ;Rx Number 12
           WRITE ?164,U,$PIECE(LINE,U,13)
 +15      ;Rx Name 16
           WRITE ?177,U,$EXTRACT($PIECE(LINE,U,14),1,16)
 +16      ;Charge Amount 11
           WRITE ?194,U,$$RJ^XLFSTR($JUSTIFY($PIECE(LINE,U,8),8,2),11)
 +17      ;Unit 4
           WRITE ?206,U,$PIECE(LINE,U,7)
 +18      ;IB STATUS 13
           WRITE ?211,U,$PIECE(LINE,U,6)
 +19      ;AR STATUS 21
           WRITE ?225,U,$PIECE(LINE,U,15)
 +20       QUIT 
 +21      ;
 +22      ;Get dates for #350 entries
GETDTS()  ; Get appropriate selection trigger dates by type of service
 +1       ;Determine transaction type 52, RX Manual RX Out pat, inpatient, LTC inpatient, LTC Outpatient
 +2       ;based on transaction type get date used for selection and determine if it falls within the 
 +3       ;date range for the report.
 +4       ; Return: Transaction type/File derived from/SELDT (Selection date)/DISPDT (display date).
 +5       ; in the case of RX the following is appended to the return /RX #/Drug Name
 +6        NEW IBTYPINT,IBTYPE,IBTYPE,IBBG,DATES,RESPONSE,SVCTYP,RXFLDS,RXRFILL,RXNUM,RXNAME,IBCAT,IBDTENT
 +7        NEW RXDATE,RXIEN,RXNODE,IBDTFRM,RXFILDT,NORELDT
 +8        SET RESPONSE=""
           SET RXRFILL=""
           SET IBCAT=""
           SET IBDTFRM=""
           SET IBDTENT=""
           SET NORELDT=0
 +9       ;RX via pharmacy system
 +10       SET IBCAT=IBFLDS(350,IBIEN,.03,"E")
 +11       SET IBTYPE=IBFLDS(350,IBIEN,.04,"E")
           SET SVCTYP=+IBTYPE
 +12      ;RX
           IF SVCTYP=52
               Begin DoDot:1
 +13      ;get refill # if available and store it in RXRFILL
 +14               IF $PIECE(IBTYPE,";",2)'=""
                       SET RXRFILL=$PIECE(IBTYPE,":",3)
 +15               KILL ^TMP($JOB,"RXRDT")
 +16               SET RXIEN=+$PIECE(IBTYPE,":",2)
 +17               SET RXNODE="0,2"
 +18               IF RXRFILL'=""
                       SET RXNODE="0,2,R^^"_RXRFILL
 +19               DO RX^PSO52API(DFN,"RXRDT",RXIEN,,RXNODE,,)
 +20               IF +$GET(^TMP($JOB,"RXRDT",RXIEN,0))=-1
                       SET RESPONSE="RX/"_"350#"_$PIECE(^TMP($JOB,"RXRDT",RXIEN,0),U,2)
                       QUIT 
 +21               IF RESPONSE'=""
                       QUIT 
 +22      ;No data for refill
                   IF RXRFILL'=""
                       IF $PIECE(^TMP($JOB,"RXRDT",DFN,RXIEN,"RF",0),U,1)=-1
                           QUIT 
 +23      ;get the release date if this is a refill (RXRFILL'="") 
 +24               IF RXRFILL'=""
                       SET RXDATE=$PIECE($GET(^TMP($JOB,"RXRDT",DFN,RXIEN,"RF",RXRFILL,17)),U,1)
 +25      ;and if it is the original fill
 +26              IF '$TEST
                       SET RXDATE=$PIECE($GET(^TMP($JOB,"RXRDT",DFN,RXIEN,31)),U,1)
 +27      ;get the fill date if this is a refill (RXRFILL'="") 
 +28               IF RXRFILL'=""
                       SET RXFILDT=$PIECE($GET(^TMP($JOB,"RXRDT",DFN,RXIEN,"RF",RXRFILL,0.01)),U,1)
 +29      ;and if it is the original fill
 +30              IF '$TEST
                       SET RXFILDT=+$PIECE($GET(^TMP($JOB,"RXRDT",DFN,RXIEN,22)),U,1)
 +31      ;
 +32      ;if no release date then use the refill date instead
 +33      ;NORELDT=1 indicates that release date does not exist. Note: we set RXDATE=RXFILDT only for the inclusion logic, that compares release date with the selected date range
                   IF 'RXDATE
                       IF RXFILDT
                           SET RXDATE=RXFILDT
                           SET NORELDT=1
 +34               SET RXDATE=RXDATE\1
 +35               SET RXNUM=^TMP($JOB,"RXRDT",DFN,RXIEN,.01)
 +36               SET RXNAME=$PIECE(^TMP($JOB,"RXRDT",DFN,RXIEN,6),U,2)
 +37               SET RESPONSE="RX/"_"350/"_RXDATE_"/"_RXDATE_"/"_RXNUM_"/"_$EXTRACT(RXNAME,1,16)_":"_NORELDT_U_RXFILDT
               End DoDot:1
 +38       IF RESPONSE'=""
               QUIT RESPONSE
 +39      ;Manually entered RX
 +40       IF SVCTYP=350
               Begin DoDot:1
 +41      ; Medical Charge
                   IF IBCAT'["RX"
                       QUIT 
 +42               SET IBDTENT=IBFLDS(350,IBIEN,.15,"I")
 +43               IF IBDTENT=""
                       SET IBDTENT=IBFLDS(350,IBIEN,12,"I")
 +44               SET IBDTFRM=IBFLDS(350,IBIEN,.14,"I")
 +45               IF IBDTFRM=""
                       SET IBDTFRM=IBDTENT
 +46               SET RESPONSE="RXM/"_"350/"_IBDTENT_"/"_IBDTFRM
               End DoDot:1
 +47       IF RESPONSE'=""
               QUIT RESPONSE
 +48      ;Inpatient or LTC Inpatient
 +49       IF IBCAT["INPT"!(IBCAT["ADMISSION")
               Begin DoDot:1
 +50      ;INP/350/(#.14) DATE BILLED FROM - used as trigger date to compare against the date range/(#.14) DATE BILLED FROM - used as DOS
 +51               SET RESPONSE="INP/"_"350/"_IBFLDS(350,IBIEN,.14,"I")_"/"_IBFLDS(350,IBIEN,.14,"I")
               End DoDot:1
 +52       IF RESPONSE'=""
               QUIT RESPONSE
 +53      ;All Outpatient except for LTC
 +54       SET RESPONSE="OPT/350/"_IBFLDS(350,IBIEN,.14,"I")_"/"_IBFLDS(350,IBIEN,.14,"I")
 +55       QUIT RESPONSE
 +56      ;
PAUSE(IBQUIT) ;
 +1        IF $GET(RCPAGE)>0
               IF TRM
                   KILL DIR
                   SET DIR(0)="E"
                   DO ^DIR
                   KILL DIR
                   if +Y=0
                       SET IBQUIT=1
 +2        QUIT 
 +3       ;
CLEAN     ; KILL ALL REMAINING VARIABLES BEFORE EXIT
 +1        KILL ^TMP($JOB,"RXRDT")
 +2        KILL RXFLDS,IBFLDS,TRIGDT,DPTDFN,IBRXFILL,IBRXNAM,IBRXNUM,ICANCLD,LTR1,LTR2,LTR3,LTR4,VADM
 +3        KILL ARSTAT,ARAPPR,ARRSC
 +4        QUIT 
 +5       ;