| 1 | IBCNERP2 ;DAOU/BHS - IBCNE IIV RESPONSE REPORT COMPILE ;03-JUN-2002 | 
|---|
| 2 | ;;2.0;INTEGRATED BILLING;**184,271**;21-MAR-94 | 
|---|
| 3 | ;;Per VHA Directive 10-93-142, this routine should not be modified. | 
|---|
| 4 | ; | 
|---|
| 5 | ; Input vars from IBCNERP1: | 
|---|
| 6 | ;  IBCNERTN="IBCNERP1" | 
|---|
| 7 | ;  IBCNESPC("BEGDT")=Start Dt for rpt | 
|---|
| 8 | ;  IBCNESPC("ENDDT")=End Dt for rpt | 
|---|
| 9 | ;  IBCNESPC("PYR")=Pyr IEN for rpt. If "", then show all. | 
|---|
| 10 | ;  IBCNESPC("PAT")=Pt IEN for rpt. If "", then show all. | 
|---|
| 11 | ;  IBCNESPC("TYPE")=A (All Responses) for date range OR M (Most Recent | 
|---|
| 12 | ;   Responses) for date range (by unique Pyr/Pt pair) | 
|---|
| 13 | ;  IBCNESPC("SORT")=1 (Pyr nm) OR 2 (Pt nm) | 
|---|
| 14 | ;  IBCNESPC("TRCN")=Trace #^IEN, if non-null, all other params are null | 
|---|
| 15 | ;  IBCNESPC("RFLAG")=Report Flag used to indicate which report is being | 
|---|
| 16 | ;   run.  Response Report (0), Inactive Report (1), or Ambiguous | 
|---|
| 17 | ;   Report (2). | 
|---|
| 18 | ;  IBCNESPC("DTEXP")=Expiration date used in the inactive policy report | 
|---|
| 19 | ; | 
|---|
| 20 | ; Output vars used by IBCNERP3: | 
|---|
| 21 | ;  Structure of ^TMP based on IIV Response File (#365) | 
|---|
| 22 | ;   IBCNERTN="IBCNERP1" | 
|---|
| 23 | ;   SORT1=PyrNm (SORT=1) or PtNm(SORT=2) | 
|---|
| 24 | ;   SORT2=PtNm (SORT=1) or PyrNm (SORT=2) | 
|---|
| 25 | ;  ^TMP($J,IBCNERTN,SORT1,SORT2,CNT,0/1) based on ^IBCN(365,DA,0/1) | 
|---|
| 26 | ;   CNT=Seq ct | 
|---|
| 27 | ;  ^TMP($J,IBCNERTN,SORT1,SORT2,2,EBCT) based on ^IBCN(365,DA,2,EBCT,0) | 
|---|
| 28 | ;   EBCT = Elig/Benefit multiple field IEN (ptr to 365.02) | 
|---|
| 29 | ;  ^TMP($J,IBCNERTN,SORT1,SORT2,2,EBCT,NTCT) based on | 
|---|
| 30 | ;   ^IBCN(365,DA,2,EB,0,NT,0) Notes for EB seg | 
|---|
| 31 | ;   NTCT = Notes Ct may not equal Notes IEN (365.22) if ln must wrap | 
|---|
| 32 | ;  ^TMP($J,IBCNERTN,SORT1,SORT2,3,CNCT) based on ^IBCN(365,DA,3,CNCT,0) | 
|---|
| 33 | ;   CNCT = Contact Person multiple field IEN (ptr to 365.03) | 
|---|
| 34 | ;  ^TMP($J,IBCNERTN,SORT1,SORT2,4,CT) based on ^IBCN(365,DA,4) | 
|---|
| 35 | ;    CT=1 if len of text <=70, else ln is split | 
|---|
| 36 | ;  ^TMP($J,IBCNERTN,SORT1,SORT2,5,CT) based on # lns of comments reqd | 
|---|
| 37 | ;    CT=1 to display future retransmission date | 
|---|
| 38 | ; | 
|---|
| 39 | ; Must call at EN | 
|---|
| 40 | Q | 
|---|
| 41 | ; | 
|---|
| 42 | ; | 
|---|
| 43 | EN(IBCNERTN,IBCNESPC) ; Entry | 
|---|
| 44 | ; Init | 
|---|
| 45 | N IBDT,IBBDT,IBPY,IBPYR,IBPT | 
|---|
| 46 | N IBPAT,IBPTR,SORT1,SORT2,RPTDATA,IBTOT | 
|---|
| 47 | N PYRIEN,PATIEN,IBTRC,IBTYP,IBCT,IBSRT,IBEXP,FRST,TQN,DONTINC,IPRF | 
|---|
| 48 | ; | 
|---|
| 49 | I '$D(ZTQUEUED),$G(IOST)["C-" W !!,"Compiling report data ..." | 
|---|
| 50 | ; | 
|---|
| 51 | ; Temp ct | 
|---|
| 52 | S (IBTOT,IBCT)=0 | 
|---|
| 53 | ; | 
|---|
| 54 | ; Kill scratch globals | 
|---|
| 55 | K ^TMP($J,IBCNERTN),^TMP($J,IBCNERTN_"X") | 
|---|
| 56 | ; | 
|---|
| 57 | S IBTRC=$G(IBCNESPC("TRCN")) | 
|---|
| 58 | ; Skip for TRACE# | 
|---|
| 59 | I IBTRC'="" G TRCN | 
|---|
| 60 | ; | 
|---|
| 61 | S IBBDT=IBCNESPC("BEGDT") | 
|---|
| 62 | S IBPY=$G(IBCNESPC("PYR")) | 
|---|
| 63 | S IBPT=$G(IBCNESPC("PAT")) | 
|---|
| 64 | S IBTYP=$G(IBCNESPC("TYPE")) | 
|---|
| 65 | S IBSRT=$G(IBCNESPC("SORT")) | 
|---|
| 66 | S IBEXP=$G(IBCNESPC("DTEXP")) | 
|---|
| 67 | S IPRF=$G(IBCNESPC("RFLAG")) | 
|---|
| 68 | ; | 
|---|
| 69 | ; Loop thru the IIV Response File (#365) by Date/Time Response Rec X-Ref | 
|---|
| 70 | ; S IBDT=$O(^IBCN(365,"AD",IBCNESPC("ENDDT"))) | 
|---|
| 71 | ; Initialize IBDT to end date | 
|---|
| 72 | S IBDT=IBCNESPC("ENDDT")_".999999" | 
|---|
| 73 | F  S IBDT=$O(^IBCN(365,"AD",IBDT),-1) Q:IBDT=""!($P(IBDT,".",1)<IBBDT)  D  Q:$G(ZTSTOP) | 
|---|
| 74 | . S PYRIEN=$S(IBPY="":0,1:$O(^IBCN(365,"AD",IBDT,IBPY),-1)) | 
|---|
| 75 | . F  S PYRIEN=$O(^IBCN(365,"AD",IBDT,PYRIEN)) Q:'PYRIEN!((IBPY'="")&(PYRIEN'=IBPY))  D  Q:$G(ZTSTOP) | 
|---|
| 76 | .. I $D(ZTQUEUED),$$S^%ZTLOAD() S ZTSTOP=1 Q | 
|---|
| 77 | .. ; Pyr nm from Pyr File (#365.12) | 
|---|
| 78 | .. S IBPYR=$P($G(^IBE(365.12,PYRIEN,0)),U) | 
|---|
| 79 | .. I IBPYR="" Q | 
|---|
| 80 | .. S PATIEN=$S(IBPT="":0,1:$O(^IBCN(365,"AD",IBDT,PYRIEN,IBPT),-1)) | 
|---|
| 81 | .. F  S PATIEN=$O(^IBCN(365,"AD",IBDT,PYRIEN,PATIEN)) Q:'PATIEN!((IBPT'="")&(PATIEN'=IBPT))  D  Q:$G(ZTSTOP) | 
|---|
| 82 | ... ; Pt nm from Pt File (#2) | 
|---|
| 83 | ... S IBPAT=$P($G(^DPT(PATIEN,0)),U) | 
|---|
| 84 | ... I IBPAT="" Q | 
|---|
| 85 | ... S IBPTR=0 | 
|---|
| 86 | ... F  S IBPTR=$O(^IBCN(365,"AD",IBDT,PYRIEN,PATIEN,IBPTR)) Q:'IBPTR  D  Q:$G(ZTSTOP) | 
|---|
| 87 | .... S IBTOT=IBTOT+1 | 
|---|
| 88 | .... ; Since non-positive identifications are no longer placed in the | 
|---|
| 89 | .... ; insurance buffer, two new reports were added to allow users to | 
|---|
| 90 | .... ; view the responses.  One report (IPFR=1) shows only responses | 
|---|
| 91 | .... ; of inactive policies.  The other (IPFR=2) shows ambiguous responses. | 
|---|
| 92 | .... ; Any response that is not active nor inactive is considered | 
|---|
| 93 | .... ; ambiguous for the purposes of this report. | 
|---|
| 94 | .... I IPRF D  Q:DONTINC | 
|---|
| 95 | ..... N EBIC,NODE1,PCD | 
|---|
| 96 | ..... S DONTINC=1 | 
|---|
| 97 | ..... S TQN=$P($G(^IBCN(365,IBPTR,0)),U,5) Q:TQN=""  ; TQ ien (#365.1) | 
|---|
| 98 | ..... S NODE1=$G(^IBCN(365,IBPTR,1)) | 
|---|
| 99 | ..... I $P($G(^IBCN(365.1,TQN,0)),U,11)="V" Q     ; If verification quit | 
|---|
| 100 | ..... I IPRF=1,($P(NODE1,U,12)="")!($P(NODE1,U,12)<$G(IBEXP)) Q | 
|---|
| 101 | ..... S FRST=$O(^IBCN(365,IBPTR,2,0)) | 
|---|
| 102 | ..... I FRST="" Q | 
|---|
| 103 | ..... S PCD=$P($G(^IBCN(365,IBPTR,2,FRST,0)),U,6) | 
|---|
| 104 | ..... I PCD]"",PCD'="IIV Eligibility Determination" Q | 
|---|
| 105 | ..... S EBIC=$$GET1^DIQ(365.02,FRST_","_IBPTR_",","ELIGIBILITY/BENEFIT INFO:CODE") | 
|---|
| 106 | ..... I PCD]"",IPRF=1,EBIC'=6 Q | 
|---|
| 107 | ..... I PCD]"",IPRF=2,EBIC=6!(EBIC=1) Q | 
|---|
| 108 | ..... I $P(NODE1,U,14)]"" Q  ; Error Condition | 
|---|
| 109 | ..... I $P(NODE1,U,15)]"" Q  ; Error Action | 
|---|
| 110 | ..... I $P($G(^IBCN(365,IBPTR,4)),U)]"" Q  ; Error Text | 
|---|
| 111 | ..... S DONTINC=0 | 
|---|
| 112 | ....; | 
|---|
| 113 | .... I $D(ZTQUEUED),IBTOT#100=0,$$S^%ZTLOAD() S ZTSTOP=1 Q | 
|---|
| 114 | .... ; Sort fields | 
|---|
| 115 | .... S SORT1=$S(IBSRT=1:IBPYR,1:IBPAT) | 
|---|
| 116 | .... S SORT2=$S(IBSRT=1:IBPAT,1:IBPYR) | 
|---|
| 117 | .... ; Only check for Most Recent - Pyr/Pt pair | 
|---|
| 118 | .... I IBTYP="M",$D(^TMP($J,IBCNERTN_"X",PYRIEN,PATIEN)) Q | 
|---|
| 119 | .... ; Set temp ind. | 
|---|
| 120 | .... I IBTYP="M" S ^TMP($J,IBCNERTN_"X",PYRIEN,PATIEN)="" | 
|---|
| 121 | .... ; Update ct | 
|---|
| 122 | .... S IBCT=IBCT+1 | 
|---|
| 123 | .... ; Sort data - build RPTDATA array | 
|---|
| 124 | .... K RPTDATA | 
|---|
| 125 | .... D GETDATA^IBCNERPE(IBPTR,.RPTDATA) | 
|---|
| 126 | .... ; Merge data from RPTDATA to ^TMP | 
|---|
| 127 | .... ;M ^TMP($J,IBCNERTN,SORT1,SORT2,IBCT)=RPTDATA | 
|---|
| 128 | .... N %X,%Y | 
|---|
| 129 | .... S %X="RPTDATA(" | 
|---|
| 130 | .... S %Y="^TMP($J,IBCNERTN,SORT1,SORT2,IBCT," | 
|---|
| 131 | .... I $D(RPTDATA)#10=1 S ^TMP($J,IBCNERTN,SORT1,SORT2,IBCT)=RPTDATA | 
|---|
| 132 | .... D %XY^%RCR K %X,%Y | 
|---|
| 133 | ; | 
|---|
| 134 | ; Purge index of duplicate Pyr/Pt combos | 
|---|
| 135 | K ^TMP($J,IBCNERTN_"X") | 
|---|
| 136 | ; | 
|---|
| 137 | G EXIT | 
|---|
| 138 | ; | 
|---|
| 139 | TRCN ; Trace # proc. | 
|---|
| 140 | S IBPTR=$P(IBTRC,U,2) | 
|---|
| 141 | I IBPTR="" G EXIT | 
|---|
| 142 | ; Sort the data - build RPTDATA array | 
|---|
| 143 | KILL RPTDATA | 
|---|
| 144 | D GETDATA^IBCNERPE(IBPTR,.RPTDATA) | 
|---|
| 145 | ; Default sort - one record | 
|---|
| 146 | ; Pyr nm from Pyr File (#365.12) | 
|---|
| 147 | S PYRIEN=$P(RPTDATA(0),U,3) | 
|---|
| 148 | I PYRIEN="" G EXIT | 
|---|
| 149 | S SORT1=$P($G(^IBE(365.12,PYRIEN,0)),U,1) | 
|---|
| 150 | I SORT1="" G EXIT | 
|---|
| 151 | ; Pt nm from Pt File (#2) | 
|---|
| 152 | S PATIEN=$P(RPTDATA(0),U,2) | 
|---|
| 153 | I PATIEN="" G EXIT | 
|---|
| 154 | S SORT2=$P($G(^DPT(PATIEN,0)),U,1) | 
|---|
| 155 | I SORT2="" G EXIT | 
|---|
| 156 | ; Merge data- RPTDATA to ^TMP | 
|---|
| 157 | ;M ^TMP($J,IBCNERTN,SORT1,SORT2,1)=RPTDATA | 
|---|
| 158 | N %X,%Y | 
|---|
| 159 | S %X="RPTDATA(" | 
|---|
| 160 | S %Y="^TMP($J,IBCNERTN,SORT1,SORT2,1," | 
|---|
| 161 | I $D(RPTDATA)#10=1 S ^TMP($J,IBCNERTN,SORT1,SORT2,1)=RPTDATA | 
|---|
| 162 | D %XY^%RCR K %X,%Y | 
|---|
| 163 | ; | 
|---|
| 164 | EXIT ; | 
|---|
| 165 | Q | 
|---|
| 166 | ; | 
|---|
| 167 | X12(FILE,CODE,FLD) ; Output based on File # and X12 code | 
|---|
| 168 | I $G(FILE)=""!($G(CODE)="") Q "" | 
|---|
| 169 | ; Quit w/o label if not defined in File Def. | 
|---|
| 170 | Q $$LBL(365.02,$G(FLD))_$P($G(^IBE(FILE,CODE,0)),U,2) | 
|---|
| 171 | ; | 
|---|
| 172 | LBL(FILE,FLD) ; Determine label from File Def. | 
|---|
| 173 | N IBLBL | 
|---|
| 174 | ; | 
|---|
| 175 | I $G(FILE)=""!($G(FLD)="") Q "" | 
|---|
| 176 | S IBLBL=$$GET1^DID(FILE,FLD,"","TITLE") | 
|---|
| 177 | Q $S(IBLBL'="":IBLBL_": ",1:"") | 
|---|
| 178 | ; | 
|---|