Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: RCDPARC

RCDPARC.m

Go to the documentation of this file.
  1. RCDPARC ;ALB/TJB - CARC REPORT ON PAYER OR CARC CODE ;9/15/14 3:00pm
  1. ;;4.5;Accounts Receivable;**303,321,326,432**;Mar 20, 1995;Build 16
  1. ;;Per VA Directive 6402, this routine should not be modified.
  1. Q
  1. ; PRCA*4.5*303 - CARC and Payer report
  1. ; DESCRIPTION :
  1. ; The following generates a report that displays selected or all
  1. ; CARC Codes and Payers and totals the amounts for each CARC code.
  1. ; several filters may be used to limit the CARC codes or Payer information
  1. ; to be displayed:
  1. EN ; Entry point for Report
  1. N DUOUT,DTOUT,DIR,X,Y,RCDT1,RCDT2,RCDET,ZTRTN,ZTSK,ZTDESC,ZTSAVE,ZTSTOP,%ZIS,POP,DTOK,DIVHDR,CRHDR
  1. N RCDIV,RCINC,VAUTD,RCLAIM,RCRANGE,RCNP,RCJOB,RCNP1,RCPG,RCNOW,RCHR,RCODE,RCPAR,RCPAY,RCRARC,RCSTOP,RCWHICH,EX
  1. S RCRARC=0,RCSTOP=0
  1. ; ICR 1077 - Get division/station
  1. D DIVISION^VAUTOMA
  1. I 'VAUTD&($D(VAUTD)'=11) G ARCQ
  1. ;
  1. S DIR("A")="(S)ummary or(D)etail Report format?: ",DIR(0)="SA^S:Summary Information only;D:Detail and Totals"
  1. S DIR("B")="SUMMARY" D ^DIR K DIR
  1. I $D(DTOUT)!$D(DUOUT)!(Y="") G ARCQ
  1. S RCDET=($E(Y,1)="D")
  1. ; Get CARC Codes for report
  1. D GCARC^RCDPCRR(.RCODE) G:RCSTOP ARCQ
  1. ;
  1. S RCRARC=0 ; Set RARCs not to display on report, but keep around just in case Susan changes her mind.
  1. ;
  1. S RCLAIM=$$RTYPE^RCDPEU1("A") G:RCLAIM=-1 ARCQ ; Payer Type
  1. ; Get Payer information
  1. S RCWHICH=$$NMORTIN^RCDPEAPP() G:RCWHICH=-1 ARCQ ; Filter by Payer Name or TIN
  1. ;
  1. S RCPAR("SELC")=$$PAYRNG^RCDPEU1(1,1,RCWHICH) ; PRCA*4.5*326 - Selected or Range of Payers
  1. G:RCPAR("SELC")=-1 ARCQ ; PRCA*4.5*326 '^' or timeout
  1. S RCPAY=RCPAR("SELC")
  1. ;
  1. I RCPAR("SELC")'="A" D G:XX=-1 ARCQ ; PRCA*4.5*326 - Since we don't want all payers
  1. . S RCPAR("TYPE")=RCLAIM ; prompt for payers we do want
  1. . S RCPAR("SRCH")=$S(RCWHICH=2:"T",1:"N")
  1. . S RCPAR("FILE")=344.4
  1. . S RCPAR("DICA")="Select Insurance Company"_$S(RCWHICH=1:" NAME: ",1:" TIN: ")
  1. . S XX=$$SELPAY^RCDPEU1(.RCPAR)
  1. ;
  1. S DIR("A")="Sort Report by (C)ARC or (P)ayer?: ",DIR(0)="SA^P:Payer Name;CARC: CARC Codes;C:CARC Codes"
  1. S DIR("B")="CARC" D ^DIR K DIR
  1. I $D(DTOUT)!$D(DUOUT)!(Y="") G ARCQ
  1. S RCSORT=$E(Y,1)
  1. ;
  1. S DIR("?")="Enter the Beginning date for the report"
  1. S DIR(0)="DAO^:"_DT_":APE",DIR("A")="Start Date: ",DIR("B")="T" D ^DIR K DIR
  1. I $D(DTOUT)!$D(DUOUT)!(Y="") G ARCQ
  1. S RCDT1=Y
  1. S DIR("?")="Enter the end date for the report"
  1. S DIR("B")=$$DATE^RCDPRU($P($$NOW^XLFDT,"."),"2Z")
  1. S DIR(0)="DAO^"_RCDT1_":"_DT_":APE",DIR("A")="End Date: ",DIR("B")="T" D ^DIR K DIR
  1. I $D(DTOUT)!$D(DUOUT)!(Y="") G ARCQ
  1. S RCDT2=Y
  1. S DTOK=$$CHECKDT^RCDPRU(RCDT1,RCDT2,361.1)
  1. I 'DTOK W !!,"*** Note: Date Range "_$$DATE^RCDPRU(RCDT1)_" - "_$$DATE^RCDPRU(RCDT2)," ***",! W "*** No Records found ***",! D ASK^RCDPRU(.RCSTOP) G ARCQ
  1. ; Get input to export to excel. Removed per Susan (03/24/2015)
  1. S RCEXCEL=0
  1. ;
  1. S %ZIS="QM" D ^%ZIS Q:POP
  1. I $D(IO("Q")) D Q
  1. . S ZTRTN="ENQ^RCDPARC",ZTDESC="AR - 835 CARC & PAYER DATA REPORT",ZTSAVE("*")=""
  1. . D ^%ZTLOAD
  1. . W !!,$S($D(ZTSK):"Your task number"_ZTSK_" has been queued.",1:"Unable to queue this job.")
  1. . K ZTSK,IO("Q") D HOME^%ZIS
  1. U IO
  1. ;
  1. ENQ ; Queue point for report.
  1. S RCNOW=$$NOW^RCDPRU(),RCPG=0,$P(RCHR,"=",IOM)=""
  1. ;
  1. K ^TMP("RCDPARC_REPORT",$J)
  1. ; Collect the data and put it into the ^TMP global
  1. D GETDATA($G(RCODE("CARC")),.RCPAY,.RCTIN,$G(RCSORT),$G(RCRARC),RCDT1,RCDT2,$NA(^TMP("RCDPARC_REPORT",$J)),.VAUTD)
  1. ;
  1. REPORT ; Print out the report
  1. ; Set up Division Header Text and CARC Header Text
  1. S:VAUTD=1 DIVHDR="ALL" D:VAUTD=0
  1. . N I S DIVHDR="",I="" F S I=$O(VAUTD(I)) Q:I="" S:DIVHDR'="" DIVHDR=DIVHDR_", "_VAUTD(I) S:DIVHDR="" DIVHDR=VAUTD(I)
  1. I RCODE("CARC")="ALL" S CRHDR="ALL"
  1. E S CRHDR=RCODE("CARC")
  1. ; Trim information so it will fit on an 80 or IOM character line
  1. D:($L(DIVHDR)+$L(CRHDR))>(IOM-25)
  1. . N VAL,DH,CH,R1,R2 S DH=0,CH=0,R1=0,R2=0,VAL=(IOM-25)\2 ; get half of the screen length
  1. . S:$L(DIVHDR)>VAL DH=1 S:$L(CRHDR)>VAL CH=1 S:DH=0 R1=VAL-$L(DIVHDR) S:CH=0 R2=VAL-$L(CRHDR)
  1. . I $L(DIVHDR)>(VAL+R2) S DIVHDR=$E(DIVHDR,1,(VAL+R2))_"..."
  1. . I $L(CRHDR)>(VAL+R1) S CRHDR=$E(CRHDR,1,(VAL+R2))_"..."
  1. ;
  1. I 'RCEXCEL D
  1. . S RCSTOP=$$NEWPG(.RCPG,1,.RCSL,RCDET,$G(RCRARC)) ; PRCA*4.5*326 - use $$NEWPG for first header
  1. E D
  1. . ; Excel Report
  1. . W "CARC^PAYER^TIN^REP_DATE^AMOUNT",!
  1. ;
  1. D PRTREP($NA(^TMP("RCDPARC_REPORT",$J,"REPORT")),$NA(^TMP("RCDPARC_REPORT",$J,"~~SUM")),RCSORT,RCDET,$G(RCRARC),.RCSTOP) G:RCSTOP ARCQ
  1. D ASK^RCDPRU(.RCSTOP)
  1. ;
  1. ARCQ ; Clean-up and quit
  1. K DHDR,RCEXCEL,RCLIST,RCLPAY,RCODE,RCPAY,RCSORT,RCRARC,RCTIN,RCTLIST
  1. K ^TMP("RCDPEU1",$J) ; PRCA*4.5*326
  1. ;K ^TMP("RCDPARC_REPORT",$J)
  1. Q
  1. ;
  1. PRTREP(DATA,SUMM,SORT,CD,RA,RCSTOP) ; Print report data out of the "REPORT" subarray
  1. ; Input: DATA - Compiled report data in ^TMP("RCDPARC_REPORT",$J)
  1. ; SUM - Compiled grand totals in ^TMP("RCDPARC_REPORT",$J,"~~SUM")
  1. ; SORT - Selected Sort Option
  1. ; CD - 'D' - Detail report, 'S' - Summary report
  1. ; RA - Always 0 for now to not display CARCS on report
  1. ; Output: RCSTOP - 1 if user quit out of the display, 0 otherwise
  1. N AMTA,AMTB,AMTP,CL,CZ,DESC,DIWL,DIWR,DLN,DX0,DZ,IX,IY,LN,LN2,PAY,PCT,PYRTINS,PYZ,RCSL
  1. N TIN,TIX,TIY,X,XX,YY,ZZ
  1. S $P(LN,"-",80)="",$P(DLN,"=",80)="",$P(LN2,"-",78)="",LN2=" "_LN2,RCSL=8
  1. ; Do Grand totals - moved to top of report per Susan on 7/16/2015
  1. S DX0=$G(@SUMM@("CLAIMS")),PCT=0
  1. S:+$P(DX0,U,2)'=0 PCT=$J(($P(DX0,U,4)/$P(DX0,U,2))*100,3,0)
  1. S:+$P(DX0,U,2)=0 PCT="ERR"
  1. I RCSL'<(IOSL-4) S RCSTOP=$$NEWPG(.RCPG,1,.RCSL,CD,RA) Q:RCSTOP
  1. W !
  1. W "GRAND TOTAL ALL CARCS / ALL PAYERS ON REPORT",!
  1. W " TOTAL #CLAIMS: ",$J($P(DX0,U,1),6,0)," ADJ: ",PCT,"% [TOT AMT ADJUSTED / TOT AMT BILLED]",!
  1. W " AMT ADJUST: $",$J($P(DX0,U,4),11,2)," AMT BILLED: $",$J($P(DX0,U,2),11,2)," AMT PAID: $",$J($P(DX0,U,3),11,2),!
  1. W !,DLN,!! S RCSL=RCSL+5
  1. ;
  1. S IX="",IEN="",CL=0,AMTB=0,AMTP=0,DESC="Empty Description"
  1. F S IX=$O(@DATA@(IX)) Q:IX=""!RCSTOP S TIX=$G(@DATA@(IX)),IY="" D Q:RCSTOP
  1. . D:SORT="C" Q:RCSTOP ; CARC Sorted output IX => CARC; IY => Payer Name
  1. .. S DX0=$G(@DATA@(IX,"~~SUM")),CL=$P(DX0,U,1),AMTB=$P(DX0,U,2),AMTP=$P(DX0,U,3),AMTA=$P(DX0,U,4),DESC=$P(DX0,U,5),PCT=(AMTA/AMTB)*100
  1. .. W "CARC: ",$J(IX,4)," TOTAL #CLAIMS: ",$J(CL,5,0)," ADJ:",$J(PCT,3,0),"% [TOT AMT ADJUSTED / TOT AMT BILLED]",! S RCSL=RCSL+1
  1. .. I RCSL'<(IOSL-2) S RCSTOP=$$NEWPG(.RCPG,0,.RCSL,CD,RA) Q:RCSTOP
  1. .. W " AMT ADJUST: ",$J(AMTA,11,2)," AMT BILLED: ",$J(AMTB,12,2)," AMT PAID: ",$J(AMTP,12,2),! S RCSL=RCSL+1
  1. .. I RCSL'<(IOSL-2) S RCSTOP=$$NEWPG(.RCPG,0,.RCSL,CD,RA) Q:RCSTOP
  1. .. S X="Desc: "_$E(DESC,1,73),DIWL=1,DIWR=80 K ^UTILITY($J,"W") D ^DIWP,^DIWW S RCSL=RCSL+1
  1. .. I RCSL'<(IOSL-2) S RCSTOP=$$NEWPG(.RCPG,0,.RCSL,CD,RA) Q:RCSTOP
  1. .. W LN,! S RCSL=RCSL+1
  1. .. I RCSL'<(IOSL-2) S RCSTOP=$$NEWPG(.RCPG,0,.RCSL,CD,RA) Q:RCSTOP
  1. .. S CZ=0,PAY="" F S PAY=$O(@DATA@(IX,"~~SUM",PAY)) Q:PAY=""!RCSTOP S CZ=CZ+1 D Q:RCSTOP
  1. ... S DZ=@DATA@(IX,"~~SUM",PAY),PCT=$S((+$P(DZ,U,2)'=0):($P(DZ,U,4)/$P(DZ,U,2)*100),1:"ERROR")
  1. ... I CZ>1 W LN2,! S RCSL=RCSL+1
  1. ... I RCSL'<(IOSL-2) S RCSTOP=$$NEWPG(.RCPG,0,.RCSL,CD,RA) Q:RCSTOP
  1. ... ; PRCA*4.5*321 Start modified code block
  1. ... D PAYTINS^RCDPRU2(PAY,.PYRTINS)
  1. ... W " PAYER NAME/TIN",!
  1. ... S RCSL=RCSL+1
  1. ... S PYZ="" F S PYZ=$O(PYRTINS(PYZ)) Q:PYZ="" D Q:RCSTOP
  1. .... W " ",$$PAYTIN^RCDPRU2(PYRTINS(PYZ),76),!
  1. .... S RCSL=RCSL+1
  1. .... I RCSL'<(IOSL-2) S RCSTOP=$$NEWPG(.RCPG,0,.RCSL,CD,RA)
  1. ... ; PRCA*4.5*321 End modified code block
  1. ... I RCSL'<(IOSL-2) S RCSTOP=$$NEWPG(.RCPG,0,.RCSL,CD,RA) Q:RCSTOP
  1. ... W " #CLAIMS: ",$J($P(DZ,U,1),4,0)," ADJ:",$J(PCT,3,0),"% [ADJ: ",$J($P(DZ,U,4),10,2),"/BILLED: ",$J($P(DZ,U,2),10,2),"] PAID: ",$J($P(DZ,U,3),10,2),! S RCSL=RCSL+1
  1. ... I RCSL'<(IOSL-2) S RCSTOP=$$NEWPG(.RCPG,0,.RCSL,CD,RA) Q:RCSTOP
  1. ... D:RCDET DETAIL(DATA,IX,PAY,.RCSL,.RCSTOP) Q:RCSTOP ; Data array, CARC, Payer/TIN
  1. ... I RCSL'<(IOSL-2) S RCSTOP=$$NEWPG(.RCPG,0,.RCSL,CD,RA) Q:RCSTOP
  1. .. Q:RCSTOP W LN,! S RCSL=RCSL+1 ; Removed "!," in front of "LN"
  1. .. I RCSL'<(IOSL-2) S RCSTOP=$$NEWPG(.RCPG,0,.RCSL,CD,RA) Q:RCSTOP
  1. . Q:RCSTOP
  1. . D:SORT="P" Q:RCSTOP ; Payer Sorted output IX => Payer Name; IY => CARC
  1. .. ; PRCA*4.5*321 Start modified code block
  1. .. D PAYTINS^RCDPRU2(IX,.PYRTINS)
  1. .. W " PAYER NAME/TIN",!
  1. .. S RCSL=RCSL+1
  1. .. S PYZ="" F S PYZ=$O(PYRTINS(PYZ)) Q:PYZ="" D Q:RCSTOP
  1. ... W " ",$$PAYTIN^RCDPRU2(PYRTINS(PYZ),76),!
  1. ... S RCSL=RCSL+1
  1. ... I RCSL'<(IOSL-2) S RCSTOP=$$NEWPG(.RCPG,0,.RCSL,CD,RA)
  1. .. ; PRCA*4.5*321 End modified code block
  1. .. S DX0=$G(@DATA@(IX,"~~SUM")),CL=$P(DX0,U,1),AMTB=$P(DX0,U,2),AMTP=$P(DX0,U,3),AMTA=$P(DX0,U,4),PCT=(AMTA/AMTB)*100
  1. .. W "#CLAIMS: ",$J(CL,4,0)," ADJ: ",$J(PCT,3,0),"% [ADJ:",$J(AMTA,10,2),"/BILLED:",$J(AMTB,11,2),"] PAID:",$J(AMTP,11,2),! S RCSL=RCSL+1
  1. .. W LN,!! S RCSL=RCSL+2
  1. .. S CZ=0,IY="" F S IY=$O(@DATA@(IX,"~~SUM",IY)) Q:IY="" S CZ=CZ+1 D Q:RCSTOP
  1. ... S DZ=@DATA@(IX,"~~SUM",IY)
  1. ... I CZ>1 W LN2,! S RCSL=RCSL+1
  1. ... I RCSL'<(IOSL-2) S RCSTOP=$$NEWPG(.RCPG,0,.RCSL,CD,RA) Q:RCSTOP
  1. ... S PCT=$S((+$P(DZ,U,2)'=0):($P(DZ,U,4)/$P(DZ,U,2)*100),1:"ERROR")
  1. ... W ?2,"CARC: ",$J(IY,4),?14,"#CLAIMS: ",$J($P(DZ,U,1),5,0),?30,"ADJ: ",$J(PCT,3,0),"% [AMT ADJUSTED / AMT BILLED]",! S RCSL=RCSL+1
  1. ... I RCSL'<(IOSL-2) S RCSTOP=$$NEWPG(.RCPG,0,.RCSL,CD,RA) Q:RCSTOP
  1. ... W ?2,"AMT ADJUST: ",$J($P(DZ,U,4),11,2),?26," BILLED: ",$J($P(DZ,U,2),12,2),?56," PAID: ",$J($P(DZ,U,3),12,2),! S RCSL=RCSL+1
  1. ... I RCSL'<(IOSL-2) S RCSTOP=$$NEWPG(.RCPG,0,.RCSL,CD,RA) Q:RCSTOP
  1. ... S X="Desc: "_$E($P(DZ,U,5),1,68),DIWL=3,DIWR=80 K ^UTILITY($J,"W") D ^DIWP,^DIWW S RCSL=RCSL+1
  1. ... I RCSL'<(IOSL-2) S RCSTOP=$$NEWPG(.RCPG,0,.RCSL,CD,RA) Q:RCSTOP
  1. ... D:RCDET DETAIL(DATA,IX,IY,.RCSL,.RCSTOP) Q:RCSTOP ; Data array, Payer/TIN, CARC
  1. ... I RCSL'<(IOSL-2) S RCSTOP=$$NEWPG(.RCPG,0,.RCSL,CD,RA) Q:RCSTOP
  1. .. Q:RCSTOP W LN,! S RCSL=RCSL+1 ; Removed "!," in front of LN
  1. .. I RCSL'<(IOSL-2) S RCSTOP=$$NEWPG(.RCPG,0,.RCSL,CD,RA) Q:RCSTOP
  1. Q
  1. ;
  1. DETAIL(DATA,L1,L2,RCSL,DSTOP) ; Print detail information for this entry
  1. N IEN,DOS,DX,DY,HDR,PCT,PAT,SSN
  1. S HDR=0
  1. S IEN="" F S IEN=$O(@DATA@(L1,L2,IEN)) Q:IEN=""!DSTOP S HDR=HDR+1 D Q:DSTOP
  1. . ; Print out Detail
  1. . D:HDR=1 Q:DSTOP
  1. .. W " ------------------------------------------------------------------------------",! S RCSL=RCSL+1
  1. .. W " CLAIM# DOS %ADJ [AMT ADJ/AMT BILLED] PAID PATIENT NAME SSN",! S RCSL=RCSL+1
  1. .. W " ==============================================================================",! S RCSL=RCSL+1
  1. .. I RCSL'<(IOSL-2) S DSTOP=$$NEWPG(.RCPG,0,.RCSL,CD,RA) Q:DSTOP
  1. . S DX=@DATA@(L1,L2,IEN,0),DY=@DATA@(L1,L2,IEN,1),DOS=$$DATE^RCDPRU($$GET1^DIQ(399,$P(DX,U,1)_",",.03,"I")),PCT=($P(DY,U,2)/$P(DX,U,6))*100
  1. . ;S $P(DX,U,6)=654321.99,$P(DX,U,7)=123456.99
  1. . S PAT=$$GET1^DIQ(2,$P(DX,U,3)_",",.01,"E"),SSN="("_$E($$GET1^DIQ(2,$P(DX,U,3)_",",.09,"E"),*-3,*)_")"
  1. . W ?2,$P(DX,U,2),?10,DOS,?19,$J(PCT,3,0),?24,$J($P(DY,U,2),9,2),?34,$J($P(DX,U,6),9,2),?44,$J($P(DX,U,7),9,2),?54,$E(PAT,1,19),?74,SSN,! S RCSL=RCSL+1
  1. . I RCSL'<(IOSL-2) S DSTOP=$$NEWPG(.RCPG,0,.RCSL,CD,RA) Q:DSTOP
  1. . ;W "RCRARC = ",RCRARC," DY=",DY,!
  1. . ; Write out RARC if we have one
  1. . I RCRARC=1&($P(DY,U,5)'="") S X="RARC: "_$P(DY,U,5)_" "_$P(DY,U,6),DIWL=5,DIWR=80 K ^UTILITY($J,"W") D ^DIWP,^DIWW S RCSL=RCSL+1
  1. . I RCSL'<(IOSL-2) S DSTOP=$$NEWPG(.RCPG,0,.RCSL,CD,RA) Q:DSTOP
  1. W ! S RCSL=RCSL+1
  1. Q
  1. HDR(CD,RA) ; Report header
  1. N ZZ S ZZ=$S($G(RA)=1:" & RARC",1:"")
  1. Q:CD "EDI LOCKBOX 835 CARC"_ZZ_" DATA REPORT - DETAIL FORMAT"
  1. Q "EDI LOCKBOX 835 CARC DATA REPORT - SUMMARY FORMAT"
  1. ;
  1. HDRP(Z,X,Z1) ; Print Header (Z=String, X=1 (line feed) X=0 (no LF), Z1 (page number right justified)
  1. I $G(X)=1 W !
  1. W ?(IOM-$L(Z)\2),Z W:$G(Z1)]"" ?(IOM-$L(Z1)),Z1
  1. Q
  1. NEWPG(RCPG,RCNEW,RCSL,CD,RA) ; Check for new page needed, output header
  1. ; RCPG = Page number passwd by referece
  1. ; RCNEW = 1 to force new page
  1. ; RCSL = page length passed by reference
  1. ; Function returns 1 if user chooses to stop output
  1. N ZSTOP,XX ; PRCA*4.5*326
  1. S ZSTOP=0
  1. I RCNEW!'RCPG!(($Y+5)>IOSL) D
  1. . D:RCPG ASK^RCDPRU(.ZSTOP) Q:ZSTOP
  1. . S RCPG=RCPG+1 W @IOF
  1. . D HDRP($$HDR(CD,RA),1,"Page: "_RCPG)
  1. . D HDRP("SORT BY: "_$S($E(RCSORT,1)="C":"CARC",1:"Payer")_" RUN DATE: "_RCNOW,1)
  1. . D HDRP("Divisions: "_DIVHDR_" CARCs: "_CRHDR,1)
  1. . ; PRCA*4.5*326 - Include M/P/T filter in header
  1. . S XX=$S(RCWHICH=2:"PAYER TINS",1:"835 PAYERS")_": "_$S(RCPAY="R":"Range",RCPAY="S":"Selected",1:"All")
  1. . S XX=XX_$J("",38-$L(XX))_"MEDICAL/PHARMACY/TRICARE/CHAMPVA: " ;PRCA*4.5*432 Add CHAMPVA, 44->38
  1. . S XX=XX_$S(RCLAIM="M":"MEDICAL",RCLAIM="P":"PHARMACY",RCLAIM="T":"TRICARE",RCLAIM="C":"CHAMPVA",1:"ALL") ;PRCA*4.5*432 CHAMPVA
  1. . D HDRP(XX,1)
  1. . D HDRP("EOB PAID DATE RANGE: "_$$DATE^RCDPRU(RCDT1)_" - "_$$DATE^RCDPRU(RCDT2),1)
  1. . W !,RCHR,! S RCSL=7
  1. Q ZSTOP
  1. ;
  1. ;
  1. ; Select Range or list of CARC Codes
  1. CARC ;
  1. N DIR,OKAY
  1. S DIR("A")="Enter a List or Range of CARC codes: ",DIR(0)="F^1:200"
  1. S DIR("?")="Codes can be entered as: 1,2,4:15,A1:B6"
  1. S DIR("?",1)="Please enter a list or range of CARC Codes, use a comma "
  1. S DIR("?",2)="and a colon ':' to delimit ranges of codes."
  1. D ^DIR K DIR
  1. I $D(DTOUT)!$D(DUOUT)!(Y="") S RCSTOP=1 Q
  1. S RCODE=X,OKAY=$$VAL^RCDPRU(345,.RCODE)
  1. I 'OKAY S DIR("A",1)="Invalid Range/List of CARC Codes, Please reenter.." G CARC
  1. K DIR("A",1) ; Clean up DIR
  1. Q RCODE
  1. ; Get data for report and apply filters if necessary
  1. GETDATA(GCARC,GPAYER,GTIN,GSORT,GRARC,GSTART,GSTOP,GARRAY,GDIV) ;
  1. ; Input: GCCARC - Range of CARC codes to include
  1. ; GPAYER - Range of payers to include
  1. ; GTIN - Range of TINs to include
  1. ; GSORT - Sort order
  1. ; GRARC - Flag to display RARC codes on the report (0 = No)
  1. ; GSTART - Start date
  1. ; GSTOP - End date
  1. ; GARRAY - Root of the array in which to store the output data
  1. ; GDIV - Range of Divisions to include
  1. ; Output: @GARRAY("BILLS",IEN,0)=A1^A2^A3^A4^A5^A6^A7
  1. ; A1=Pointer to BILL/CLAIM file (#399)
  1. ; A2=Bill Number
  1. ; A3=Pointer to patient file (#2)
  1. ; A4=Payer Name from EOB, pointer to Insurance file (#36)
  1. ; A5=TIN from EOB
  1. ; A6=Total Charges
  1. ; A7=Paid amount
  1. ;
  1. N SDT,IEN,CNT,ZX,RM,ZND,CARR,PNARR,PTARR,RCSET,GLINE,DZN,PTR,ZPAY,RCERR,RCDEN
  1. S SDT=$O(^IBM(361.1,"E",GSTART),-1)
  1. ; Set up the arrays for filtering on CARC, PAYER name and Payer TINs
  1. D RNG^RCDPRU("CARC",GCARC,.CARR)
  1. ;Get possible bills to work on from ^IBM(361.1,"E") index
  1. F S SDT=$O(^IBM(361.1,"E",SDT)) Q:SDT=""!(SDT>GSTOP) D
  1. . S IEN="" F S IEN=$O(^IBM(361.1,"E",SDT,IEN)) Q:IEN="" D
  1. .. S RM=$$GET1^DIQ(361.1,IEN_",",102,"I") Q:$G(RM)=1 ; Quit looking if this EOB is removed
  1. .. ; If not all divisions then check to see if this EOB should be included
  1. .. I GDIV=0 S RCDIV="",RCDEN=$$GET1^DIQ(361.1,IEN_",",.01,"I") S:RCDEN'="" RCDIV=$$GET1^DIQ(399,RCDEN_",",.22,"I") Q:RCDIV="" Q:$G(GDIV(RCDIV))=""
  1. .. ; Get the data for this claim and 835 Payer
  1. .. S ZND=^IBM(361.1,IEN,0),PTR=$P(ZND,U,1),ZPAY=$$GPAYR^RCDPRU2($P(ZND,U,3))
  1. .. S RCSET=1
  1. .. ; Are there CARC codes for this record
  1. .. S:($G(^IBM(361.1,IEN,10,0))']"")&($G(^IBM(361.1,IEN,15,0))']"") RCSET=0
  1. .. ;
  1. .. I RCPAY="A",RCLAIM'="A" D Q:'RCSET ; If both not specified check for inclusion
  1. ... S RCSET=$$ISTYPE^RCDPEU1(361.1,IEN,RCLAIM) ; PRCA*4.5*326 filter by Tricare etc.
  1. .. ;
  1. .. ; Check Payer Name
  1. .. I RCPAY'="A" D
  1. ... S RCSET=$$ISSEL^RCDPEU1(361.1,IEN) ; PRCA*4.5*326 this this a selected payer.
  1. .. ;
  1. .. Q:RCSET=0 ; No need to check further get next IEN
  1. .. ; Pointer to the bill (^DGCR(399,))^KBill #^Patient pointer^Payer Pointer [^DIC(36)]^Payer ID/TIN^Total Charges^Paid Amount
  1. .. S DZN=$G(^DGCR(399,PTR,0))
  1. .. S:($G(^IBM(361.1,IEN,10,0))]"")!($G(^IBM(361.1,IEN,15,0))]"") @GARRAY@("BILLS",IEN,0)=PTR_U_$P(DZN,U,1)_U_$P(DZN,U,2)_U_$P(ZND,U,2)_U_$P(ZND,U,3)_U_$G(^DGCR(399,PTR,"U1"))_U_$P($G(^IBM(361.1,IEN,1)),U,1)
  1. .. S CNT=0
  1. .. ; Get Claim Level CARC Data
  1. .. D:$G(^IBM(361.1,IEN,10,0))]""
  1. ... ; Get CARC information, CARC is in 361.11
  1. ... N IX,RCGX S IX="" D GETS^DIQ(361.1,IEN_",","10*;","E","RCGX")
  1. ... ; CARC^AMOUNT^QUANTITY^DESCRIPTION
  1. ... S IX="" F S IX=$O(RCGX("361.111",IX)) Q:IX="" D
  1. .... ; Quit if this CARC is not in the list
  1. .... Q:'$$CHK^RCDPRU2("CARC",RCGX("361.111",IX,.01,"E"),.CARR)
  1. .... S CNT=CNT+1
  1. .... S @GARRAY@("BILLS",IEN,"C",CNT)=RCGX("361.111",IX,.01,"E")_U_RCGX("361.111",IX,.02,"E")_U_RCGX("361.111",IX,.03,"E")_U_RCGX("361.111",IX,.04,"E")
  1. .. ; Get Line level CARC Data
  1. .. D:$G(^IBM(361.1,IEN,15,0))]""
  1. ... ; Get CARC and RARC information. CARC is in 361.11511 and RARC is in 361.1154
  1. ... N IX,RCGX S IX="" D GETS^DIQ(361.1,IEN_",","15*;","IE","RCGX")
  1. ... ; CARC^AMOUNT^QUANTITY^DESCRIPTION
  1. ... S IX="" F S IX=$O(RCGX("361.11511",IX)) Q:IX="" D
  1. .... ; Quit if this CARC is not on the list
  1. .... Q:'$$CHK^RCDPRU2("CARC",RCGX("361.11511",IX,.01,"E"),.CARR)
  1. .... S CNT=CNT+1
  1. .... S @GARRAY@("BILLS",IEN,"C",CNT)=RCGX("361.11511",IX,.01,"E")_U_RCGX("361.11511",IX,.02,"E")_U_RCGX("361.11511",IX,.03,"E")_U_RCGX("361.11511",IX,.04,"E")
  1. ... ; RARC^DESCRIPTION
  1. ... S IX="" F ZX=1:1 S IX=$O(RCGX("361.1154",IX)) Q:IX="" S @GARRAY@("BILLS",IEN,"R",ZX)=RCGX("361.1154",IX,.02,"E")_U_RCGX("361.1154",IX,.03,"E")
  1. ; Possible bills have been accumulated in "BILLS" sub-array, Apply filters and accumulate data in "REPORT" sub-array
  1. D SORT^RCDPARC1(GARRAY,GSORT)
  1. Q