- FBAAIAR1 ;ALB/FA - FEE IPAC Vendor DoD Invoice Number Inquiry Report ;1/16/2014
- ;;3.5;FEE BASIS;**123**;JAN 30, 1995;Build 51
- ;;Per VA Directive 6402, this routine should not be modified.
- ;
- ;
- ;-----------------------------------------------------------------------------
- ; Entry Points
- ; EN - DoD Invoice Inquiry Report - Run report
- ;-----------------------------------------------------------------------------
- ;
- Q
- ;
- EN ;EP
- ; Main report entry point
- N FBDODINV,FBFORMAT
- Q:'$$DODISEL(.FBDODINV) ; Select DoD Invoice number
- Q:'$$FORMAT(.FBFORMAT) ; Select Report Format
- Q:$$DEVICE(FBDODINV,FBFORMAT) ; Select Device and compile report
- Q
- ;
- DODISEL(FBDODINV) ; Ask for the DoD Invoice
- ; Input: None
- ; Output: FBDODINV - Selected DoD Invoice Number
- ; Returns: 1 - User quit out, 0 otherwise
- ; Called From: EN
- ;
- N DIR,DIROUT,DIRUT,DTOUT,DUOUT,RET,X,Y
- S RET=1 ; Assume DoD Invoice Selection
- W @IOF,!,"IPAC Vendor DoD Invoice Number Inquiry Report"
- W !!,"This report will display all of the VistA invoices for the "
- W !,"selected DoD Invoice Number."
- W !
- S DIR(0)="F^3:22"
- S DIR("A")="DoD Invoice Number"
- S DIR("?",1)="All of the associated VistA invoices will be displayed for the"
- S DIR("?",2)="selected DoD invoice number"
- W ! D ^DIR K DIR
- I $D(DIRUT)!(Y="") D
- . S RET=0 ; User wants to exit
- . W *7
- S FBDODINV=Y ; Selected DoD Invoice number
- Q RET
- ;
- FORMAT(FBFORMAT) ; Capture the report format from the user (normal or CSV output)
- ; Input: None
- ; Output: FBFORMAT - 1 - CSV Format, 0 otherwise
- ; Returns: 0 - User quit out, 1 otherwise
- ; Called From: EN
- ;
- N DIR,DIROUT,DIRUT,DTOUT,DUOUT,RET,X,Y
- S RET=1
- S DIR(0)="Y"
- S DIR("A")="Do you want to capture the output in a CSV format"
- S DIR("B")="NO"
- S DIR("?",1)="If you want to capture the output from this report in a comma-separated"
- S DIR("?",2)="values (CSV) format, then answer YES here. A CSV format is something that"
- S DIR("?",3)="could be easily imported into a spreadsheet program like Excel."
- S DIR("?",4)=" "
- S DIR("?")="If you just want a normal report output, then answer NO here."
- W ! D ^DIR K DIR
- I $D(DIRUT) D
- . S RET=0 ; User wants to exit
- . W *7
- S FBFORMAT=Y
- Q RET
- ;
- DEVICE(FBDODINV,FBFORMAT) ; Device Selection and Report compilation
- ; Input: FBDODINV - DoD invoice number to compile VistA invoices for
- ; FBFORMAT - 1 - CSV Format, 0 otherwise
- ; Output: Report is compiled if a device is selected
- ; Returns: 1 - User quit out, 0 otherwise
- ; Called From: EN
- N DIR,POP,RET,X,Y,ZTDESC,ZTRTN,ZTSAVE,ZTSK
- S RET=1
- I 'FBFORMAT D
- . W !!,"This report is 80 characters wide. Please choose an appropriate device.",!
- E D
- . W !!,"For CSV output, turn logging or capture on now."
- . W !,"To avoid undesired wrapping of the data saved to the file,"
- . W !,"please enter ""0;256;99999"" at the ""DEVICE:"" prompt.",!
- ;
- S ZTRTN="COMPILE^FBAAIAR1"
- S ZTDESC="Fee Basis IPAC Vendor DoD Invoice Inquiry Report"
- S ZTSAVE("FBDODINV")=""
- S ZTSAVE("FBFORMAT")=""
- D EN^XUTMDEVQ(ZTRTN,ZTDESC,.ZTSAVE,"QM",1)
- S:POP RET=0
- I $G(ZTSK) D
- . W !!,"Report compilation has started with task# ",ZTSK,".",!
- . S DIR(0)="E"
- . D ^DIR
- Q RET
- ;
- COMPILE ; Entry point for the compile to build the scratch global
- ; may be background task if job queued
- ; Input: FBDODINV - DoD Invoice number to use for selection
- ; FBFORMAT - 1 - CSV format, 0 otherwise
- ; Output: Report is compiled and output
- ; Called From: Report processing
- ;
- K ^TMP("FBAAIAR1",$J)
- I '$D(ZTQUEUED) W !!,"Compiling IPAC Vendor DoD Invoice Inquiry Report. Please wait ... "
- D COMPOUT(FBDODINV) ; Compile Outpatient invoices
- D COMPIN(FBDODINV) ; Compile Inpatient invoices
- D COMPRX(FBDODINV) ; Compile Pharmacy invoices
- ;
- D PRINT^FBAAIAR2(FBDODINV,FBFORMAT) ; Print report
- D ^%ZISC ; Close the device
- K ^TMP("FBAAIAR1",$J) ; Kill scratch global
- S:$D(ZTQUEUED) ZTREQ="@" ; Purge the task
- Q
- ;
- COMPOUT(FBDODINV) ; Compile Outpatient and Inpatient Ancillary Invoice data
- ; Input: FBDODINV - DoD Invoice number to use for selection
- ; Output: VistA invoices for the selected DoD invoice number are
- ; added to the temporary global
- ; Called From: COMPILE
- ;
- N DATA,IDTIEN,PATIEN,SVCIEN,VENIEN,VNAME
- S PATIEN=""
- F D Q:PATIEN="" ; Patient IEN
- . S PATIEN=$O(^FBAAC("DODI",FBDODINV,PATIEN))
- . Q:PATIEN=""
- . S VENIEN=""
- . F D Q:VENIEN="" ; Vendor IEN
- . . S VENIEN=$O(^FBAAC("DODI",FBDODINV,PATIEN,VENIEN))
- . . Q:VENIEN=""
- . . S VNAME=$P($G(^FBAAV(VENIEN,0)),U,1) ; Vendor Name
- . . S IDTIEN=""
- . . F D Q:IDTIEN="" ; Initial Service Date IEN
- . . . S IDTIEN=$O(^FBAAC("DODI",FBDODINV,PATIEN,VENIEN,IDTIEN))
- . . . Q:IDTIEN=""
- . . . S SVCIEN=""
- . . . F D Q:SVCIEN="" ; Service Provided IEN
- . . . . S SVCIEN=$O(^FBAAC("DODI",FBDODINV,PATIEN,VENIEN,IDTIEN,SVCIEN))
- . . . . Q:SVCIEN=""
- . . . . ;
- . . . . ; Store the row data for the invoice into the temporary global
- . . . . D ROWDATAO(VNAME,PATIEN,VENIEN,IDTIEN,SVCIEN)
- Q
- ;
- ROWDATAO(VNAME,PATIEN,VENIEN,IDTIEN,SVCIEN) ;
- ; Retrieves the information needed to display the VistA invoice row for an
- ; outpatient invoice or an Inpatient Ancillary invoice.
- ; Input: VNAME - Vendor Name of the Invoice
- ; PATIEN - Patient IEN
- ; VENIEN - Vendor IEN of the invoice
- ; IDTIEN - Internal Initial Treatment Date IEN
- ; SVCIEN - Invoice IEN
- ; ^TMP("FAAIAR1",$J) - Current temporary file
- ; Output: ^TMP("FAAIAR1",$J) - Updated with VistA Invoice data
- ; Called From: COMPOUT
- ;
- N DATA,INV0,INV2,INV3,INVNUM,TYPE,XX
- S INV0=$G(^FBAAC(PATIEN,1,VENIEN,1,IDTIEN,1,SVCIEN,0)) ; Outpatient Invoice 0 Node
- S INV2=$G(^FBAAC(PATIEN,1,VENIEN,1,IDTIEN,1,SVCIEN,2)) ; Outpatient Invoice 2 Node
- S INV3=$G(^FBAAC(PATIEN,1,VENIEN,1,IDTIEN,1,SVCIEN,3)) ; Outpatient Invoice 3 Node
- S INVNUM=$P(INV0,U,16) ; VistA Invoice #
- S ITYPE=+$P(INV0,U,9) ; Fee Program ptr
- S ITYPE=$S(ITYPE=2:0,1:1) ; 0 - Outpatient, 1: Inpatient Ancillary
- S TYPE=$S('ITYPE:"OUT",1:"ANC")
- S DATA=$$GETTYPEO(PATIEN,VENIEN,IDTIEN,SVCIEN,INV0,INV2) ; Void/Purge/Cancel flags
- S $P(DATA,U,2)=$P(INV0,U,14) ; Date Paid
- S $P(DATA,U,3)=$P(INV0,U,2) ; Amount Claimed
- S $P(DATA,U,4)=$P(INV0,U,3) ; Amount Paid
- S $P(DATA,U,5)=$P(INV0,U,4) ; Amount Adjusted
- S XX=IDTIEN_"-"_SVCIEN
- S ^TMP("FBAAIAR1",$J,VNAME,TYPE,INVNUM,XX)=DATA ; VistA invoice data for the invoice
- D TOTS(VNAME,TYPE,INVNUM,DATA) ; Gather totals for invoice
- Q
- ;
- GETTYPEO(PATIEN,VENIEN,IDTIEN,SVCIEN,INV0,INV2) ; Determines if the invoice has been
- ; cancelled, rejected, purged or voided or some combination
- ; Input: PATIEN - Patient IEN
- ; VENIEN - Vendor IEN
- ; IDTIEN - Initial Treatment Date IEN
- ; SVCIEN - Service Provided IEN
- ; INV0 - 0 node of the outpatient invoice
- ; INV2 - 2 node of the outpatient invoice
- ; Returns: V - Voided
- ; C - Cancelled
- ; R - Rejected
- ; P - Purged
- ; "" - Otherwise
- ; or any combination of C/V/R/P
- ; Called From: ROWDATAO
- N VAL
- S VAL=""
- S:$D(^FBAAC(PATIEN,1,VENIEN,1,IDTIEN,1,SVCIEN,"FBREJC")) VAL="R" ; Rejected
- S:$D(^FBAAC(PATIEN,"PURGE",VENIEN,0)) VAL=VAL_"P" ; Purged
- S:$P(INV2,U,4)'="" VAL=VAL_"C" ; Cancelled
- S:$P(INV0,U,21)'="" VAL=VAL_"V" ; Voided
- Q VAL
- ;
- COMPIN(FBDODINV) ; Compile Inpatient Invoice data
- ; Input: FBDODINV - DoD Invoice number to use for selection
- ; ^TMP("FAAIAR1",$J) - Current temporary file
- ; Output: ^TMP("FAAIAR1",$J) - Updated with VistA Invoice data
- ; Called From: COMPILE
- ;
- N DATA,INIEN,INVNUM,INV0,INV2,INV5,ITYPE,VNAME,XX
- S INIEN=""
- F D Q:INIEN="" ; Inpatient Invoice by DoD Invoice #
- . S INIEN=$O(^FBAAI("DODI",FBDODINV,INIEN))
- . Q:INIEN=""
- . S INV0=$G(^FBAAI(INIEN,0))
- . S INV2=$G(^FBAAI(INIEN,2))
- . S INV5=$G(^FBAAI(INIEN,5))
- . S XX=+$P(INV0,U,3) ; Vendor IEN
- . S VNAME=$P($G(^FBAAV(XX,0)),U,1) ; Vendor Name
- . S INVNUM=$P(INV0,U,1) ; VistA Invoice #
- . S DATA=$$GETTYPEI(INIEN,INV0,INV2) ; Type of Record
- . S $P(DATA,U,2)=$P(INV2,U,1) ; Date Paid
- . S $P(DATA,U,3)=$P(INV0,U,8) ; Amount Claimed
- . S $P(DATA,U,4)=$P(INV0,U,9) ; Amount Paid
- . S $P(DATA,U,5)=$P(INV0,U,10) ; Amount Adjusted
- . S ^TMP("FBAAIAR1",$J,VNAME,"INP",INVNUM,0)=DATA ; VistA invoice data for invoice
- . D TOTS(VNAME,"INP",INVNUM,DATA) ; Gather totals for invoice
- Q
- ;
- GETTYPEI(INVIEN,INV0,INV2) ; Determines if the inpatient invoice has been
- ; cancelled, rejected or voided or some combination
- ; Input: INVIEN - IEN of the inpatient invoice
- ; INV0 - 0 node of the inpatient invoice
- ; INV2 - 2 node of the inpatient invoice
- ; INV5 - 5 node of the inpatient invoice
- ; Returns: V - Voided
- ; C - Cancelled
- ; R - Rejected
- ; "" - Otherwise
- ; or any combination of C/V/R
- ; Called From: COMPIN
- N VAL
- S VAL=""
- S:$D(^FBAAI(INVIEN,"FBREJ")) VAL="R" ; Rejected
- S:$P(INV2,U,5)'="" VAL=VAL_"C" ; Cancelled
- S:$P(INV0,U,14)'="" VAL=VAL_"V" ; Voided
- Q VAL
- ;
- COMPRX(FBDODINV) ; Compile Pharmacy invoice data
- ; Input: FBDODINV - DoD Invoice number to use for selection
- ; ^TMP("FAAIAR1",$J) - Current temporary file
- ; Output: ^TMP("FAAIAR1",$J) - Updated with VistA Invoice data
- ; Called From: COMPILE
- ;
- N AMTA,AMTC,AMTP,DATA,DATEP,INVNUM,INV0,INV2,ITYPE,ITYPE2
- N PHIEN,RXIEN,RXINV,VNAME,XX
- S PHIEN="",DATEP="",ITYPE2=""
- F D Q:PHIEN="" ; Pharmacy Invoice by DoD Invoice #
- . S PHIEN=$O(^FBAA(162.1,"DODI",FBDODINV,PHIEN))
- . Q:PHIEN=""
- . S (AMTA,AMTC,AMTP)=0 ; Init amount tots for invoice
- . S RXINV=$G(^FBAA(162.1,PHIEN,0)) ; Invoice level data
- . S XX=+$P(RXINV,U,4) ; Vendor IEN
- . S VNAME=$P($G(^FBAAV(XX,0)),U,1) ; Vendor name
- . S INVNUM=$P(RXINV,U,1) ; VistA Invoice #
- . S RXIEN=""
- . F D Q:RXIEN="" ; Prescription level
- . . S RXIEN=$O(^FBAA(162.1,"DODI",FBDODINV,PHIEN,RXIEN))
- . . Q:RXIEN=""
- . . S INV0=$G(^FBAA(162.1,PHIEN,"RX",RXIEN,0)) ; Prescription 0 Node
- . . S INV2=$G(^FBAA(162.1,PHIEN,"RX",RXIEN,2)) ; Prescription 2 Node
- . . D GETTYPEP(PHIEN,RXIEN,INV2,.ITYPE2) ; Type of Pharmacy Record
- . . S XX=$P(INV2,U,8) ; Date Paid
- . . S DATEP=$S(DATEP="":XX,XX<DATEP:XX,1:DATEP) ; Find the lowest date paid
- . . S AMTC=AMTC+$P(INV0,U,4) ; Amount Claimed
- . . S AMTP=AMTP+$P(INV0,U,16) ; Amount Paid
- . . S AMTA=AMTA+$P(INV0,U,7) ; Amount Adjusted
- . S DATA=ITYPE2 ; Pharmacy Invoice Void/Cancel/Reject
- . S $P(DATA,U,2)=DATEP ; Lowest date paid
- . S $P(DATA,U,3)=AMTC ; Total Amount claimed for Invoice
- . S $P(DATA,U,4)=AMTP ; Total Amount paid for Invoice
- . S $P(DATA,U,5)=AMTA ; Total Amount adjusted for Invoice
- . S ^TMP("FBAAIAR1",$J,VNAME,"RX",INVNUM,0)=DATA ; VistA invoice data for invoice
- . D TOTS(VNAME,"RX",INVNUM,DATA) ; Gather totals for DoD invoice#
- Q
- ;
- GETTYPEP(PHIEN,RXIEN,INV2,ITYPE) ; Determines if the pharmacy invoice has any
- ; cancelled, rejected or voided prescriptions.
- ; Input: PHIEN - IEN of the pharmacy invoice
- ; RXIEN - Prescription IEN
- ; INV2 - 2 node of the pharmacy prescription invoice
- ; ITYPE - Current value for the pharmacy invoice
- ; Output: ITYPE - Updated value for the pharmacy invoice
- ; Called From: COMPRX
- I $D(^FBAA(162.1,PHIEN,"RX",RXIEN,"FBREJ")) D ; Rejected
- . S ITYPE=$S(ITYPE'["R":ITYPE_"R",1:ITYPE)
- I $P(INV2,U,11)'="" D Q ; Cancelled
- . S ITYPE=$S(ITYPE'["C":ITYPE_"C",1:ITYPE)
- I $P(INV2,U,3)'="" D Q ; Voided
- . S ITYPE=$S(ITYPE'["V":ITYPE_"V",1:ITYPE)
- Q
- ;
- TOTS(VNAME,TYPE,INVNUM,DATA) ; Gather totals and other data for all invoices for
- ; the specified DoD invoice#. Update the scratch global with information
- ; Input: VNAME - Vendor Name
- ; TYPE - "OUT" - Outpatient Invoice
- ; "ANC" - Inpatient Ancillary Invoice
- ; "INP" - Inpatient Invoice
- ; "RX" - Pharmacy Invoice
- ; INVNUM - VistA Invoice Number
- ; DATA - ^TMP("FBAAIAR1",$J,VNAME,TYPE,INVNUM)
- ; ^TMP("FBAAIAR1",$J,VNAME) - Current DoD Invoice Vendor totals
- ; ^TMP("FBAAIAR1",$J,VNAME,TYPE) - Current Type totals
- ; Output: ^TMP("FBAAIAR1",$J,VNAME) - Updated DoD Invoice Vendor totals
- ; ^TMP("FBAAIAR1",$J,VNAME,TYPE) - Updated Type totals
- ; Called From: COMPIN, COMPOUT, COMPRX
- ;
- N CURTOT
- S CURTOT=$G(^TMP("FBAAIAR1",$J,VNAME)) ; Current DoD Invoice Vendor totals
- S $P(CURTOT,U,1)=$P(DATA,U,3)+$P(CURTOT,U,1) ; New Claimed Total
- S $P(CURTOT,U,2)=$P(DATA,U,4)+$P(CURTOT,U,2) ; New Paid Total
- S $P(CURTOT,U,3)=$P(DATA,U,5)+$P(CURTOT,U,3) ; New Adjustment Total
- S $P(CURTOT,U,4)=$P(CURTOT,U,4)+1 ; New Invoice count
- S ^TMP("FBAAIAR1",$J,VNAME)=CURTOT
- S CURTOT=$G(^TMP("FBAAIAR1",$J,VNAME,TYPE)) ; Current DoD Invoice Vendor totals by type
- S $P(CURTOT,U,1)=$P(DATA,U,3)+$P(CURTOT,U,1) ; New Claimed Total
- S $P(CURTOT,U,2)=$P(DATA,U,4)+$P(CURTOT,U,2) ; New Paid Total
- S $P(CURTOT,U,3)=$P(DATA,U,5)+$P(CURTOT,U,3) ; New Adjustment Total
- S $P(CURTOT,U,4)=$P(CURTOT,U,4)+1 ; New Invoice count by type
- S ^TMP("FBAAIAR1",$J,VNAME,TYPE)=CURTOT
- Q
- ;
- --- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HFBAAIAR1 15995 printed Feb 18, 2025@23:22:01 Page 2
- FBAAIAR1 ;ALB/FA - FEE IPAC Vendor DoD Invoice Number Inquiry Report ;1/16/2014
- +1 ;;3.5;FEE BASIS;**123**;JAN 30, 1995;Build 51
- +2 ;;Per VA Directive 6402, this routine should not be modified.
- +3 ;
- +4 ;
- +5 ;-----------------------------------------------------------------------------
- +6 ; Entry Points
- +7 ; EN - DoD Invoice Inquiry Report - Run report
- +8 ;-----------------------------------------------------------------------------
- +9 ;
- +10 QUIT
- +11 ;
- EN ;EP
- +1 ; Main report entry point
- +2 NEW FBDODINV,FBFORMAT
- +3 ; Select DoD Invoice number
- if '$$DODISEL(.FBDODINV)
- QUIT
- +4 ; Select Report Format
- if '$$FORMAT(.FBFORMAT)
- QUIT
- +5 ; Select Device and compile report
- if $$DEVICE(FBDODINV,FBFORMAT)
- QUIT
- +6 QUIT
- +7 ;
- DODISEL(FBDODINV) ; Ask for the DoD Invoice
- +1 ; Input: None
- +2 ; Output: FBDODINV - Selected DoD Invoice Number
- +3 ; Returns: 1 - User quit out, 0 otherwise
- +4 ; Called From: EN
- +5 ;
- +6 NEW DIR,DIROUT,DIRUT,DTOUT,DUOUT,RET,X,Y
- +7 ; Assume DoD Invoice Selection
- SET RET=1
- +8 WRITE @IOF,!,"IPAC Vendor DoD Invoice Number Inquiry Report"
- +9 WRITE !!,"This report will display all of the VistA invoices for the "
- +10 WRITE !,"selected DoD Invoice Number."
- +11 WRITE !
- +12 SET DIR(0)="F^3:22"
- +13 SET DIR("A")="DoD Invoice Number"
- +14 SET DIR("?",1)="All of the associated VistA invoices will be displayed for the"
- +15 SET DIR("?",2)="selected DoD invoice number"
- +16 WRITE !
- DO ^DIR
- KILL DIR
- +17 IF $DATA(DIRUT)!(Y="")
- Begin DoDot:1
- +18 ; User wants to exit
- SET RET=0
- +19 WRITE *7
- End DoDot:1
- +20 ; Selected DoD Invoice number
- SET FBDODINV=Y
- +21 QUIT RET
- +22 ;
- FORMAT(FBFORMAT) ; Capture the report format from the user (normal or CSV output)
- +1 ; Input: None
- +2 ; Output: FBFORMAT - 1 - CSV Format, 0 otherwise
- +3 ; Returns: 0 - User quit out, 1 otherwise
- +4 ; Called From: EN
- +5 ;
- +6 NEW DIR,DIROUT,DIRUT,DTOUT,DUOUT,RET,X,Y
- +7 SET RET=1
- +8 SET DIR(0)="Y"
- +9 SET DIR("A")="Do you want to capture the output in a CSV format"
- +10 SET DIR("B")="NO"
- +11 SET DIR("?",1)="If you want to capture the output from this report in a comma-separated"
- +12 SET DIR("?",2)="values (CSV) format, then answer YES here. A CSV format is something that"
- +13 SET DIR("?",3)="could be easily imported into a spreadsheet program like Excel."
- +14 SET DIR("?",4)=" "
- +15 SET DIR("?")="If you just want a normal report output, then answer NO here."
- +16 WRITE !
- DO ^DIR
- KILL DIR
- +17 IF $DATA(DIRUT)
- Begin DoDot:1
- +18 ; User wants to exit
- SET RET=0
- +19 WRITE *7
- End DoDot:1
- +20 SET FBFORMAT=Y
- +21 QUIT RET
- +22 ;
- DEVICE(FBDODINV,FBFORMAT) ; Device Selection and Report compilation
- +1 ; Input: FBDODINV - DoD invoice number to compile VistA invoices for
- +2 ; FBFORMAT - 1 - CSV Format, 0 otherwise
- +3 ; Output: Report is compiled if a device is selected
- +4 ; Returns: 1 - User quit out, 0 otherwise
- +5 ; Called From: EN
- +6 NEW DIR,POP,RET,X,Y,ZTDESC,ZTRTN,ZTSAVE,ZTSK
- +7 SET RET=1
- +8 IF 'FBFORMAT
- Begin DoDot:1
- +9 WRITE !!,"This report is 80 characters wide. Please choose an appropriate device.",!
- End DoDot:1
- +10 IF '$TEST
- Begin DoDot:1
- +11 WRITE !!,"For CSV output, turn logging or capture on now."
- +12 WRITE !,"To avoid undesired wrapping of the data saved to the file,"
- +13 WRITE !,"please enter ""0;256;99999"" at the ""DEVICE:"" prompt.",!
- End DoDot:1
- +14 ;
- +15 SET ZTRTN="COMPILE^FBAAIAR1"
- +16 SET ZTDESC="Fee Basis IPAC Vendor DoD Invoice Inquiry Report"
- +17 SET ZTSAVE("FBDODINV")=""
- +18 SET ZTSAVE("FBFORMAT")=""
- +19 DO EN^XUTMDEVQ(ZTRTN,ZTDESC,.ZTSAVE,"QM",1)
- +20 if POP
- SET RET=0
- +21 IF $GET(ZTSK)
- Begin DoDot:1
- +22 WRITE !!,"Report compilation has started with task# ",ZTSK,".",!
- +23 SET DIR(0)="E"
- +24 DO ^DIR
- End DoDot:1
- +25 QUIT RET
- +26 ;
- COMPILE ; Entry point for the compile to build the scratch global
- +1 ; may be background task if job queued
- +2 ; Input: FBDODINV - DoD Invoice number to use for selection
- +3 ; FBFORMAT - 1 - CSV format, 0 otherwise
- +4 ; Output: Report is compiled and output
- +5 ; Called From: Report processing
- +6 ;
- +7 KILL ^TMP("FBAAIAR1",$JOB)
- +8 IF '$DATA(ZTQUEUED)
- WRITE !!,"Compiling IPAC Vendor DoD Invoice Inquiry Report. Please wait ... "
- +9 ; Compile Outpatient invoices
- DO COMPOUT(FBDODINV)
- +10 ; Compile Inpatient invoices
- DO COMPIN(FBDODINV)
- +11 ; Compile Pharmacy invoices
- DO COMPRX(FBDODINV)
- +12 ;
- +13 ; Print report
- DO PRINT^FBAAIAR2(FBDODINV,FBFORMAT)
- +14 ; Close the device
- DO ^%ZISC
- +15 ; Kill scratch global
- KILL ^TMP("FBAAIAR1",$JOB)
- +16 ; Purge the task
- if $DATA(ZTQUEUED)
- SET ZTREQ="@"
- +17 QUIT
- +18 ;
- COMPOUT(FBDODINV) ; Compile Outpatient and Inpatient Ancillary Invoice data
- +1 ; Input: FBDODINV - DoD Invoice number to use for selection
- +2 ; Output: VistA invoices for the selected DoD invoice number are
- +3 ; added to the temporary global
- +4 ; Called From: COMPILE
- +5 ;
- +6 NEW DATA,IDTIEN,PATIEN,SVCIEN,VENIEN,VNAME
- +7 SET PATIEN=""
- +8 ; Patient IEN
- FOR
- Begin DoDot:1
- +9 SET PATIEN=$ORDER(^FBAAC("DODI",FBDODINV,PATIEN))
- +10 if PATIEN=""
- QUIT
- +11 SET VENIEN=""
- +12 ; Vendor IEN
- FOR
- Begin DoDot:2
- +13 SET VENIEN=$ORDER(^FBAAC("DODI",FBDODINV,PATIEN,VENIEN))
- +14 if VENIEN=""
- QUIT
- +15 ; Vendor Name
- SET VNAME=$PIECE($GET(^FBAAV(VENIEN,0)),U,1)
- +16 SET IDTIEN=""
- +17 ; Initial Service Date IEN
- FOR
- Begin DoDot:3
- +18 SET IDTIEN=$ORDER(^FBAAC("DODI",FBDODINV,PATIEN,VENIEN,IDTIEN))
- +19 if IDTIEN=""
- QUIT
- +20 SET SVCIEN=""
- +21 ; Service Provided IEN
- FOR
- Begin DoDot:4
- +22 SET SVCIEN=$ORDER(^FBAAC("DODI",FBDODINV,PATIEN,VENIEN,IDTIEN,SVCIEN))
- +23 if SVCIEN=""
- QUIT
- +24 ;
- +25 ; Store the row data for the invoice into the temporary global
- +26 DO ROWDATAO(VNAME,PATIEN,VENIEN,IDTIEN,SVCIEN)
- End DoDot:4
- if SVCIEN=""
- QUIT
- End DoDot:3
- if IDTIEN=""
- QUIT
- End DoDot:2
- if VENIEN=""
- QUIT
- End DoDot:1
- if PATIEN=""
- QUIT
- +27 QUIT
- +28 ;
- ROWDATAO(VNAME,PATIEN,VENIEN,IDTIEN,SVCIEN) ;
- +1 ; Retrieves the information needed to display the VistA invoice row for an
- +2 ; outpatient invoice or an Inpatient Ancillary invoice.
- +3 ; Input: VNAME - Vendor Name of the Invoice
- +4 ; PATIEN - Patient IEN
- +5 ; VENIEN - Vendor IEN of the invoice
- +6 ; IDTIEN - Internal Initial Treatment Date IEN
- +7 ; SVCIEN - Invoice IEN
- +8 ; ^TMP("FAAIAR1",$J) - Current temporary file
- +9 ; Output: ^TMP("FAAIAR1",$J) - Updated with VistA Invoice data
- +10 ; Called From: COMPOUT
- +11 ;
- +12 NEW DATA,INV0,INV2,INV3,INVNUM,TYPE,XX
- +13 ; Outpatient Invoice 0 Node
- SET INV0=$GET(^FBAAC(PATIEN,1,VENIEN,1,IDTIEN,1,SVCIEN,0))
- +14 ; Outpatient Invoice 2 Node
- SET INV2=$GET(^FBAAC(PATIEN,1,VENIEN,1,IDTIEN,1,SVCIEN,2))
- +15 ; Outpatient Invoice 3 Node
- SET INV3=$GET(^FBAAC(PATIEN,1,VENIEN,1,IDTIEN,1,SVCIEN,3))
- +16 ; VistA Invoice #
- SET INVNUM=$PIECE(INV0,U,16)
- +17 ; Fee Program ptr
- SET ITYPE=+$PIECE(INV0,U,9)
- +18 ; 0 - Outpatient, 1: Inpatient Ancillary
- SET ITYPE=$SELECT(ITYPE=2:0,1:1)
- +19 SET TYPE=$SELECT('ITYPE:"OUT",1:"ANC")
- +20 ; Void/Purge/Cancel flags
- SET DATA=$$GETTYPEO(PATIEN,VENIEN,IDTIEN,SVCIEN,INV0,INV2)
- +21 ; Date Paid
- SET $PIECE(DATA,U,2)=$PIECE(INV0,U,14)
- +22 ; Amount Claimed
- SET $PIECE(DATA,U,3)=$PIECE(INV0,U,2)
- +23 ; Amount Paid
- SET $PIECE(DATA,U,4)=$PIECE(INV0,U,3)
- +24 ; Amount Adjusted
- SET $PIECE(DATA,U,5)=$PIECE(INV0,U,4)
- +25 SET XX=IDTIEN_"-"_SVCIEN
- +26 ; VistA invoice data for the invoice
- SET ^TMP("FBAAIAR1",$JOB,VNAME,TYPE,INVNUM,XX)=DATA
- +27 ; Gather totals for invoice
- DO TOTS(VNAME,TYPE,INVNUM,DATA)
- +28 QUIT
- +29 ;
- GETTYPEO(PATIEN,VENIEN,IDTIEN,SVCIEN,INV0,INV2) ; Determines if the invoice has been
- +1 ; cancelled, rejected, purged or voided or some combination
- +2 ; Input: PATIEN - Patient IEN
- +3 ; VENIEN - Vendor IEN
- +4 ; IDTIEN - Initial Treatment Date IEN
- +5 ; SVCIEN - Service Provided IEN
- +6 ; INV0 - 0 node of the outpatient invoice
- +7 ; INV2 - 2 node of the outpatient invoice
- +8 ; Returns: V - Voided
- +9 ; C - Cancelled
- +10 ; R - Rejected
- +11 ; P - Purged
- +12 ; "" - Otherwise
- +13 ; or any combination of C/V/R/P
- +14 ; Called From: ROWDATAO
- +15 NEW VAL
- +16 SET VAL=""
- +17 ; Rejected
- if $DATA(^FBAAC(PATIEN,1,VENIEN,1,IDTIEN,1,SVCIEN,"FBREJC"))
- SET VAL="R"
- +18 ; Purged
- if $DATA(^FBAAC(PATIEN,"PURGE",VENIEN,0))
- SET VAL=VAL_"P"
- +19 ; Cancelled
- if $PIECE(INV2,U,4)'=""
- SET VAL=VAL_"C"
- +20 ; Voided
- if $PIECE(INV0,U,21)'=""
- SET VAL=VAL_"V"
- +21 QUIT VAL
- +22 ;
- COMPIN(FBDODINV) ; Compile Inpatient Invoice data
- +1 ; Input: FBDODINV - DoD Invoice number to use for selection
- +2 ; ^TMP("FAAIAR1",$J) - Current temporary file
- +3 ; Output: ^TMP("FAAIAR1",$J) - Updated with VistA Invoice data
- +4 ; Called From: COMPILE
- +5 ;
- +6 NEW DATA,INIEN,INVNUM,INV0,INV2,INV5,ITYPE,VNAME,XX
- +7 SET INIEN=""
- +8 ; Inpatient Invoice by DoD Invoice #
- FOR
- Begin DoDot:1
- +9 SET INIEN=$ORDER(^FBAAI("DODI",FBDODINV,INIEN))
- +10 if INIEN=""
- QUIT
- +11 SET INV0=$GET(^FBAAI(INIEN,0))
- +12 SET INV2=$GET(^FBAAI(INIEN,2))
- +13 SET INV5=$GET(^FBAAI(INIEN,5))
- +14 ; Vendor IEN
- SET XX=+$PIECE(INV0,U,3)
- +15 ; Vendor Name
- SET VNAME=$PIECE($GET(^FBAAV(XX,0)),U,1)
- +16 ; VistA Invoice #
- SET INVNUM=$PIECE(INV0,U,1)
- +17 ; Type of Record
- SET DATA=$$GETTYPEI(INIEN,INV0,INV2)
- +18 ; Date Paid
- SET $PIECE(DATA,U,2)=$PIECE(INV2,U,1)
- +19 ; Amount Claimed
- SET $PIECE(DATA,U,3)=$PIECE(INV0,U,8)
- +20 ; Amount Paid
- SET $PIECE(DATA,U,4)=$PIECE(INV0,U,9)
- +21 ; Amount Adjusted
- SET $PIECE(DATA,U,5)=$PIECE(INV0,U,10)
- +22 ; VistA invoice data for invoice
- SET ^TMP("FBAAIAR1",$JOB,VNAME,"INP",INVNUM,0)=DATA
- +23 ; Gather totals for invoice
- DO TOTS(VNAME,"INP",INVNUM,DATA)
- End DoDot:1
- if INIEN=""
- QUIT
- +24 QUIT
- +25 ;
- GETTYPEI(INVIEN,INV0,INV2) ; Determines if the inpatient invoice has been
- +1 ; cancelled, rejected or voided or some combination
- +2 ; Input: INVIEN - IEN of the inpatient invoice
- +3 ; INV0 - 0 node of the inpatient invoice
- +4 ; INV2 - 2 node of the inpatient invoice
- +5 ; INV5 - 5 node of the inpatient invoice
- +6 ; Returns: V - Voided
- +7 ; C - Cancelled
- +8 ; R - Rejected
- +9 ; "" - Otherwise
- +10 ; or any combination of C/V/R
- +11 ; Called From: COMPIN
- +12 NEW VAL
- +13 SET VAL=""
- +14 ; Rejected
- if $DATA(^FBAAI(INVIEN,"FBREJ"))
- SET VAL="R"
- +15 ; Cancelled
- if $PIECE(INV2,U,5)'=""
- SET VAL=VAL_"C"
- +16 ; Voided
- if $PIECE(INV0,U,14)'=""
- SET VAL=VAL_"V"
- +17 QUIT VAL
- +18 ;
- COMPRX(FBDODINV) ; Compile Pharmacy invoice data
- +1 ; Input: FBDODINV - DoD Invoice number to use for selection
- +2 ; ^TMP("FAAIAR1",$J) - Current temporary file
- +3 ; Output: ^TMP("FAAIAR1",$J) - Updated with VistA Invoice data
- +4 ; Called From: COMPILE
- +5 ;
- +6 NEW AMTA,AMTC,AMTP,DATA,DATEP,INVNUM,INV0,INV2,ITYPE,ITYPE2
- +7 NEW PHIEN,RXIEN,RXINV,VNAME,XX
- +8 SET PHIEN=""
- SET DATEP=""
- SET ITYPE2=""
- +9 ; Pharmacy Invoice by DoD Invoice #
- FOR
- Begin DoDot:1
- +10 SET PHIEN=$ORDER(^FBAA(162.1,"DODI",FBDODINV,PHIEN))
- +11 if PHIEN=""
- QUIT
- +12 ; Init amount tots for invoice
- SET (AMTA,AMTC,AMTP)=0
- +13 ; Invoice level data
- SET RXINV=$GET(^FBAA(162.1,PHIEN,0))
- +14 ; Vendor IEN
- SET XX=+$PIECE(RXINV,U,4)
- +15 ; Vendor name
- SET VNAME=$PIECE($GET(^FBAAV(XX,0)),U,1)
- +16 ; VistA Invoice #
- SET INVNUM=$PIECE(RXINV,U,1)
- +17 SET RXIEN=""
- +18 ; Prescription level
- FOR
- Begin DoDot:2
- +19 SET RXIEN=$ORDER(^FBAA(162.1,"DODI",FBDODINV,PHIEN,RXIEN))
- +20 if RXIEN=""
- QUIT
- +21 ; Prescription 0 Node
- SET INV0=$GET(^FBAA(162.1,PHIEN,"RX",RXIEN,0))
- +22 ; Prescription 2 Node
- SET INV2=$GET(^FBAA(162.1,PHIEN,"RX",RXIEN,2))
- +23 ; Type of Pharmacy Record
- DO GETTYPEP(PHIEN,RXIEN,INV2,.ITYPE2)
- +24 ; Date Paid
- SET XX=$PIECE(INV2,U,8)
- +25 ; Find the lowest date paid
- SET DATEP=$SELECT(DATEP="":XX,XX<DATEP:XX,1:DATEP)
- +26 ; Amount Claimed
- SET AMTC=AMTC+$PIECE(INV0,U,4)
- +27 ; Amount Paid
- SET AMTP=AMTP+$PIECE(INV0,U,16)
- +28 ; Amount Adjusted
- SET AMTA=AMTA+$PIECE(INV0,U,7)
- End DoDot:2
- if RXIEN=""
- QUIT
- +29 ; Pharmacy Invoice Void/Cancel/Reject
- SET DATA=ITYPE2
- +30 ; Lowest date paid
- SET $PIECE(DATA,U,2)=DATEP
- +31 ; Total Amount claimed for Invoice
- SET $PIECE(DATA,U,3)=AMTC
- +32 ; Total Amount paid for Invoice
- SET $PIECE(DATA,U,4)=AMTP
- +33 ; Total Amount adjusted for Invoice
- SET $PIECE(DATA,U,5)=AMTA
- +34 ; VistA invoice data for invoice
- SET ^TMP("FBAAIAR1",$JOB,VNAME,"RX",INVNUM,0)=DATA
- +35 ; Gather totals for DoD invoice#
- DO TOTS(VNAME,"RX",INVNUM,DATA)
- End DoDot:1
- if PHIEN=""
- QUIT
- +36 QUIT
- +37 ;
- GETTYPEP(PHIEN,RXIEN,INV2,ITYPE) ; Determines if the pharmacy invoice has any
- +1 ; cancelled, rejected or voided prescriptions.
- +2 ; Input: PHIEN - IEN of the pharmacy invoice
- +3 ; RXIEN - Prescription IEN
- +4 ; INV2 - 2 node of the pharmacy prescription invoice
- +5 ; ITYPE - Current value for the pharmacy invoice
- +6 ; Output: ITYPE - Updated value for the pharmacy invoice
- +7 ; Called From: COMPRX
- +8 ; Rejected
- IF $DATA(^FBAA(162.1,PHIEN,"RX",RXIEN,"FBREJ"))
- Begin DoDot:1
- +9 SET ITYPE=$SELECT(ITYPE'["R":ITYPE_"R",1:ITYPE)
- End DoDot:1
- +10 ; Cancelled
- IF $PIECE(INV2,U,11)'=""
- Begin DoDot:1
- +11 SET ITYPE=$SELECT(ITYPE'["C":ITYPE_"C",1:ITYPE)
- End DoDot:1
- QUIT
- +12 ; Voided
- IF $PIECE(INV2,U,3)'=""
- Begin DoDot:1
- +13 SET ITYPE=$SELECT(ITYPE'["V":ITYPE_"V",1:ITYPE)
- End DoDot:1
- QUIT
- +14 QUIT
- +15 ;
- TOTS(VNAME,TYPE,INVNUM,DATA) ; Gather totals and other data for all invoices for
- +1 ; the specified DoD invoice#. Update the scratch global with information
- +2 ; Input: VNAME - Vendor Name
- +3 ; TYPE - "OUT" - Outpatient Invoice
- +4 ; "ANC" - Inpatient Ancillary Invoice
- +5 ; "INP" - Inpatient Invoice
- +6 ; "RX" - Pharmacy Invoice
- +7 ; INVNUM - VistA Invoice Number
- +8 ; DATA - ^TMP("FBAAIAR1",$J,VNAME,TYPE,INVNUM)
- +9 ; ^TMP("FBAAIAR1",$J,VNAME) - Current DoD Invoice Vendor totals
- +10 ; ^TMP("FBAAIAR1",$J,VNAME,TYPE) - Current Type totals
- +11 ; Output: ^TMP("FBAAIAR1",$J,VNAME) - Updated DoD Invoice Vendor totals
- +12 ; ^TMP("FBAAIAR1",$J,VNAME,TYPE) - Updated Type totals
- +13 ; Called From: COMPIN, COMPOUT, COMPRX
- +14 ;
- +15 NEW CURTOT
- +16 ; Current DoD Invoice Vendor totals
- SET CURTOT=$GET(^TMP("FBAAIAR1",$JOB,VNAME))
- +17 ; New Claimed Total
- SET $PIECE(CURTOT,U,1)=$PIECE(DATA,U,3)+$PIECE(CURTOT,U,1)
- +18 ; New Paid Total
- SET $PIECE(CURTOT,U,2)=$PIECE(DATA,U,4)+$PIECE(CURTOT,U,2)
- +19 ; New Adjustment Total
- SET $PIECE(CURTOT,U,3)=$PIECE(DATA,U,5)+$PIECE(CURTOT,U,3)
- +20 ; New Invoice count
- SET $PIECE(CURTOT,U,4)=$PIECE(CURTOT,U,4)+1
- +21 SET ^TMP("FBAAIAR1",$JOB,VNAME)=CURTOT
- +22 ; Current DoD Invoice Vendor totals by type
- SET CURTOT=$GET(^TMP("FBAAIAR1",$JOB,VNAME,TYPE))
- +23 ; New Claimed Total
- SET $PIECE(CURTOT,U,1)=$PIECE(DATA,U,3)+$PIECE(CURTOT,U,1)
- +24 ; New Paid Total
- SET $PIECE(CURTOT,U,2)=$PIECE(DATA,U,4)+$PIECE(CURTOT,U,2)
- +25 ; New Adjustment Total
- SET $PIECE(CURTOT,U,3)=$PIECE(DATA,U,5)+$PIECE(CURTOT,U,3)
- +26 ; New Invoice count by type
- SET $PIECE(CURTOT,U,4)=$PIECE(CURTOT,U,4)+1
- +27 SET ^TMP("FBAAIAR1",$JOB,VNAME,TYPE)=CURTOT
- +28 QUIT
- +29 ;