| [613] | 1 | PSOREJP0 ;BIRM/MFR - Third Party Rejects Processing Screen ;04/28/05 | 
|---|
|  | 2 | ;;7.0;OUTPATIENT PHARMACY;**148,260**;DEC 1997;Build 84 | 
|---|
|  | 3 | ; | 
|---|
|  | 4 | N PSOREJST,PSORJSRT,PSORJASC,PSOSTFLT,PSODRFLT,PSOPTFLT,PSORXFLT,PSOINFLT,PSOINGRP | 
|---|
|  | 5 | N INSLN,HIGHLN,LASTLN | 
|---|
|  | 6 | ; | 
|---|
|  | 7 | ; - Division/Site selection | 
|---|
|  | 8 | D SEL^PSOREJU1("DIVISION","^PS(59,",.PSOREJST,$$GET1^DIQ(59,+$G(PSOSITE),.01)) I $G(PSOREJST)="^" G EXIT | 
|---|
|  | 9 | ; | 
|---|
|  | 10 | ; - Initializing global variables | 
|---|
|  | 11 | S PSORJSRT="PA",PSORJASC=1,PSOSTFLT="U",(PSODRFLT,PSOPTFLT,PSORXFLT,PSOINFLT)="ALL" | 
|---|
|  | 12 | S PSOINGRP=0 | 
|---|
|  | 13 | ; | 
|---|
|  | 14 | D LST("W") | 
|---|
|  | 15 | G EXIT | 
|---|
|  | 16 | ; | 
|---|
|  | 17 | LST(PSOMENU) ; - Invokes Listmanager | 
|---|
|  | 18 | W !,"Please wait..." | 
|---|
|  | 19 | I PSOMENU="W" D EN^VALM("PSO REJECTS WORKLIST") | 
|---|
|  | 20 | I PSOMENU="VP" D EN^VALM("PSO REJECTS VIEW/PROCESS") | 
|---|
|  | 21 | D FULL^VALM1 | 
|---|
|  | 22 | Q | 
|---|
|  | 23 | ; | 
|---|
|  | 24 | HDR      ; - Header code | 
|---|
|  | 25 | N LINE1,LINE2,LINE3 | 
|---|
|  | 26 | S LINE1=$$SITES() I $L(LINE1)>80 S $E(LINE1,78,999)="..." | 
|---|
|  | 27 | ; | 
|---|
|  | 28 | S LINE2="Selection : ALL "_$S(PSOSTFLT="U":"UNRESOLVED ",PSOSTFLT="R":"RESOLVED ",1:"")_"REJECTS" | 
|---|
|  | 29 | I $G(PSOPTFLT)'="ALL" S LINE2=LINE2_" FOR "_$$NAME("P") | 
|---|
|  | 30 | I $G(PSODRFLT)'="ALL" S LINE2=LINE2_" FOR "_$$NAME("D") | 
|---|
|  | 31 | I $G(PSOINFLT)'="ALL" S LINE2=LINE2_" FOR "_$$NAME("I") | 
|---|
|  | 32 | I $G(PSOINGRP) S LINE2=LINE2_" GROUPED BY INSURANCE" | 
|---|
|  | 33 | S VALMHDR(1)=LINE1,VALMHDR(2)=LINE2 | 
|---|
|  | 34 | I PSOMENU="VP" D | 
|---|
|  | 35 | . I $G(PSORXFLT) S LINE3="Rx#       : "_$$NAME("R") | 
|---|
|  | 36 | . E  D | 
|---|
|  | 37 | . . S LINE3="Date Range: "_$$FMTE^XLFDT(+PSODTRNG,2) | 
|---|
|  | 38 | . . I +PSODTRNG'=$P(PSODTRNG,"^",2) S LINE3=LINE3_" THRU "_$$FMTE^XLFDT($P(PSODTRNG,"^",2),2) | 
|---|
|  | 39 | . S VALMHDR(3)=LINE3 | 
|---|
|  | 40 | ; | 
|---|
|  | 41 | D SETHDR() | 
|---|
|  | 42 | Q | 
|---|
|  | 43 | ; | 
|---|
|  | 44 | SETHDR() ; - Displays the Header Line | 
|---|
|  | 45 | N HDR,ORD | 
|---|
|  | 46 | ; | 
|---|
|  | 47 | S HDR="  #",$E(HDR,5)="Rx#",$E(HDR,18)="PATIENT(ID)",$E(HDR,43)="DRUG",$E(HDR,64)="REASON" | 
|---|
|  | 48 | S $E(HDR,81)="" D INSTR^VALM1(IORVON_HDR_IOINORM,1,$S(PSOMENU="W":4,1:5)) | 
|---|
|  | 49 | S ORD=$S(PSORJASC=1:"[^]",1:"[v]") | 
|---|
|  | 50 | S:PSORJSRT="RX" POS=9 S:PSORJSRT="PA" POS=30 S:PSORJSRT="DR" POS=48 S:PSORJSRT="RE" POS=71 | 
|---|
|  | 51 | D INSTR^VALM1(IOINHI_IORVON_ORD_IOINORM,POS,$S(PSOMENU="W":4,1:5)) | 
|---|
|  | 52 | Q | 
|---|
|  | 53 | ; | 
|---|
|  | 54 | INIT ; - Populates the Body section for ListMan | 
|---|
|  | 55 | K ^TMP("PSOREJP0",$J) | 
|---|
|  | 56 | D SETSORT(PSORJSRT),SETLINE | 
|---|
|  | 57 | S VALMSG="Select the entry # to view or ?? for more actions" | 
|---|
|  | 58 | Q | 
|---|
|  | 59 | ; | 
|---|
|  | 60 | SETLINE ; - Sets the line to be displayed in ListMan | 
|---|
|  | 61 | N INS,SUB,SEQ,LINE,Z,I,X,X1,X2 | 
|---|
|  | 62 | I '$D(^TMP("PSOREJSR",$J)) D  Q | 
|---|
|  | 63 | . F I=1:1:7 S ^TMP("PSOREJP0",$J,I,0)="" | 
|---|
|  | 64 | . S ^TMP("PSOREJP0",$J,8,0)="               No Clinical Third Party Payer Rejects found." | 
|---|
|  | 65 | . S VALMCNT=1 | 
|---|
|  | 66 | ; | 
|---|
|  | 67 | F I=1:1:$G(LASTLN) D RESTORE^VALM10(I) | 
|---|
|  | 68 | K INSLN,HIGHLN | 
|---|
|  | 69 | ; | 
|---|
|  | 70 | S (INS,SUB)="",LINE=0 K ^TMP("PSOREJP0",$J) | 
|---|
|  | 71 | F  S INS=$O(^TMP("PSOREJSR",$J,INS)) Q:INS=""  D | 
|---|
|  | 72 | . I INS'="<NULL>" D | 
|---|
|  | 73 | . . D GROUP(INS,.LINE) | 
|---|
|  | 74 | . F  S SUB=$O(^TMP("PSOREJSR",$J,INS,SUB),PSORJASC) Q:SUB=""  D | 
|---|
|  | 75 | . . S Z=$G(^TMP("PSOREJSR",$J,INS,SUB)) | 
|---|
|  | 76 | . . S X1="",SEQ=$G(SEQ)+1,X1=$J(SEQ,3) | 
|---|
|  | 77 | . . S $E(X1,5)=$P(Z,"^",3),$E(X1,18)=$P(Z,"^",4),$E(X1,43)=$P(Z,"^",5),$E(X1,64)=$P(Z,"^",6) | 
|---|
|  | 78 | . . S LINE=LINE+1,^TMP("PSOREJP0",$J,LINE,0)=X1,HIGHLN(LINE)="" | 
|---|
|  | 79 | . . S X2="",$E(X2,5)="Payer Message: "_$P(Z,"^",7) | 
|---|
|  | 80 | . . S LINE=LINE+1,^TMP("PSOREJP0",$J,LINE,0)=X2 | 
|---|
|  | 81 | . . S ^TMP("PSOREJP0",$J,SEQ,"RX")=$P(Z,"^",1,2) | 
|---|
|  | 82 | ; | 
|---|
|  | 83 | I LINE>$G(LASTLN) D | 
|---|
|  | 84 | . F I=($G(LASTLN)+1):1:LINE D SAVE^VALM10(I) | 
|---|
|  | 85 | . S LASTLN=LINE | 
|---|
|  | 86 | ; | 
|---|
|  | 87 | ; - Highlighting the prescription/insurance line | 
|---|
|  | 88 | F LN=1:1:LINE D | 
|---|
|  | 89 | . I $D(HIGHLN(LN)) D  Q | 
|---|
|  | 90 | . . D CNTRL^VALM10(LN,1,80,IOINHI,IOINORM) | 
|---|
|  | 91 | . . D CNTRL^VALM10(LN,64,3,IOUON,IOINORM) | 
|---|
|  | 92 | . . D CNTRL^VALM10(LN,67,80,IOINHI,IOINORM) | 
|---|
|  | 93 | . I $D(INSLN(LN)) D | 
|---|
|  | 94 | . . S LBL=INSLN(LN),POS=41-($L(LBL)/2+.5\1) | 
|---|
|  | 95 | . . D CNTRL^VALM10(LN,1,POS-1,IOUON_IOINHI,IOINORM) | 
|---|
|  | 96 | . . D CNTRL^VALM10(LN,POS,$L(LBL),IORVON_IOINHI,IOINORM) | 
|---|
|  | 97 | . . D CNTRL^VALM10(LN,POS+$L(LBL),81-POS-$L(LBL),IOUON_IOINHI,IOINORM) | 
|---|
|  | 98 | ; | 
|---|
|  | 99 | S VALMCNT=+$G(LINE) | 
|---|
|  | 100 | Q | 
|---|
|  | 101 | ; | 
|---|
|  | 102 | GROUP(LBL,LINE) ; Sets an insurance delimiter line | 
|---|
|  | 103 | N X,POS | 
|---|
|  | 104 | S POS=41-($L(LBL)/2+.5\1) | 
|---|
|  | 105 | S X="",$P(X," ",81)="",$E(X,POS,POS-1+$L(LBL))=LBL | 
|---|
|  | 106 | S LINE=LINE+1,^TMP("PSOREJP0",$J,LINE,0)=X,INSLN(LINE)=LBL | 
|---|
|  | 107 | Q | 
|---|
|  | 108 | ; | 
|---|
|  | 109 | SETSORT(FIELD) ; - Sets the data sorted by the FIELD specified | 
|---|
|  | 110 | N RX,REJ,STS,DAT | 
|---|
|  | 111 | K ^TMP("PSOREJSR",$J) | 
|---|
|  | 112 | ; | 
|---|
|  | 113 | ; - Worklist | 
|---|
|  | 114 | I PSOMENU="W" D | 
|---|
|  | 115 | . S RX=0 F  S RX=$O(^PSRX("REJSTS",0,RX)) Q:'RX  D | 
|---|
|  | 116 | . . S REJ=0 F  S REJ=$O(^PSRX("REJSTS",0,RX,REJ)) Q:'REJ  D | 
|---|
|  | 117 | . . . D SETTMP(RX,REJ,FIELD) | 
|---|
|  | 118 | ; | 
|---|
|  | 119 | ; - View/Process | 
|---|
|  | 120 | I PSOMENU="VP" D | 
|---|
|  | 121 | . I $G(PSORXFLT)'="ALL" D  Q | 
|---|
|  | 122 | . . S REJ=0 F  S REJ=$O(^PSRX(+PSORXFLT,"REJ",REJ)) Q:'REJ  D | 
|---|
|  | 123 | . . . I $$FLTSTS(+PSORXFLT,REJ) Q | 
|---|
|  | 124 | . . . D SETTMP(+PSORXFLT,REJ,FIELD) | 
|---|
|  | 125 | . S DAT=$P(PSODTRNG,"^")-0.0000001,(RX,REJ)=0 | 
|---|
|  | 126 | . F  S DAT=$O(^PSRX("REJDAT",DAT)) Q:'DAT!(DAT>$$ENDT())  D | 
|---|
|  | 127 | . . F  S RX=$O(^PSRX("REJDAT",DAT,RX)) Q:'RX  D | 
|---|
|  | 128 | . . . I $$FILTER(RX) Q | 
|---|
|  | 129 | . . . F  S REJ=$O(^PSRX("REJDAT",DAT,RX,REJ)) Q:'REJ  D | 
|---|
|  | 130 | . . . . I $$FLTSTS(RX,REJ) Q | 
|---|
|  | 131 | . . . . D SETTMP(RX,REJ,FIELD) | 
|---|
|  | 132 | Q | 
|---|
|  | 133 | ; | 
|---|
|  | 134 | SETTMP(RX,REJ,FIELD) ; - Sets ^TMP global that will be displayed in the body section | 
|---|
|  | 135 | N REJLST,FILL,CODE,RXNUM,PTNAME,DRNAME,MSG,REASON,MSG,X,Z,SORT,I,INS | 
|---|
|  | 136 | I $G(PSORXFLT)="ALL",$$CLOSED^PSOREJP1(RX,REJ),$$REOPN^PSOREJP1(RX,REJ) Q | 
|---|
|  | 137 | S FILL=+$$GET1^DIQ(52.25,REJ_","_RX,5) | 
|---|
|  | 138 | I '$$DIV(RX,FILL) Q | 
|---|
|  | 139 | K REJLST D GET^PSOREJU2(RX,FILL,.REJLST,,1) I '$D(REJLST) Q | 
|---|
|  | 140 | I $$FILTER(,REJLST(REJ,"INSURANCE NAME")) Q | 
|---|
|  | 141 | S PTNAME=$$PTNAME(RX) | 
|---|
|  | 142 | S DRNAME=$$GET1^DIQ(52,RX,6) | 
|---|
|  | 143 | S RXNUM=$$GET1^DIQ(52,RX,.01) | 
|---|
|  | 144 | S CODE=$G(REJLST(REJ,"CODE")) | 
|---|
|  | 145 | S MSG=$G(REJLST(REJ,"PAYER MESSAGE")) I $L(MSG)>60 S MSG=$E(MSG,1,58)_"..." | 
|---|
|  | 146 | S REASON=$S(CODE=88:"DUR:"_$G(REJLST(REJ,"REASON")),1:"79 :REFILL TOO SOON") | 
|---|
|  | 147 | S Z="",$P(Z,"^")=RX,$P(Z,"^",2)=REJ,$P(Z,"^",3)=RXNUM,$P(Z,"^",4)=PTNAME | 
|---|
|  | 148 | S $P(Z,"^",5)=$E(DRNAME,1,20),$P(Z,"^",6)=$E(REASON,1,17),$P(Z,"^",7)=MSG | 
|---|
|  | 149 | S SORT=$S(FIELD="PA":PTNAME,FIELD="DR":DRNAME,FIELD="RX":RXNUM_" ",1:REASON)_RX_REJ | 
|---|
|  | 150 | S INS="<NULL>" I $G(PSOINGRP) S INS=REJLST(REJ,"INSURANCE NAME") S:INS="" INS="***UNKNOWN***" | 
|---|
|  | 151 | S ^TMP("PSOREJSR",$J,INS,SORT)=Z | 
|---|
|  | 152 | Q | 
|---|
|  | 153 | ; | 
|---|
|  | 154 | PAT ; - Sort by Patient | 
|---|
|  | 155 | D SORT("PA") | 
|---|
|  | 156 | Q | 
|---|
|  | 157 | DRG ; - Sort by Drug | 
|---|
|  | 158 | D SORT("DR") | 
|---|
|  | 159 | Q | 
|---|
|  | 160 | RX ; - Sort by Rx | 
|---|
|  | 161 | D SORT("RX") | 
|---|
|  | 162 | Q | 
|---|
|  | 163 | REA ; - Sort by Reason | 
|---|
|  | 164 | D SORT("RE") | 
|---|
|  | 165 | Q | 
|---|
|  | 166 | SORT(FIELD) ; - Sort entries by FIELD | 
|---|
|  | 167 | I PSORJSRT=FIELD S PSORJASC=$S(PSORJASC=1:-1,1:1) | 
|---|
|  | 168 | E  S PSORJSRT=FIELD,PSORJASC=1 | 
|---|
|  | 169 | D REF | 
|---|
|  | 170 | Q | 
|---|
|  | 171 | ; | 
|---|
|  | 172 | REF ; - Screen Refresh | 
|---|
|  | 173 | W ?52,"Please wait..." D INIT S VALMBCK="R" | 
|---|
|  | 174 | Q | 
|---|
|  | 175 | GI ; - Group by Insurance | 
|---|
|  | 176 | W ?52,"Please wait..." S PSOINGRP=$S($G(PSOINGRP):0,1:1) D INIT,HDR S VALMBCK="R" | 
|---|
|  | 177 | Q | 
|---|
|  | 178 | ; | 
|---|
|  | 179 | SEL ; - Process selection of one entry | 
|---|
|  | 180 | N PSOSEL,XQORM,Z,RX,REJ,PSOCHNG | 
|---|
|  | 181 | S PSOSEL=+$P($P(Y(1),"^",4),"=",2) I 'PSOSEL S VALMSG="Invalid selection!",VALMBCK="R" Q | 
|---|
|  | 182 | S Z=$G(^TMP("PSOREJP0",$J,PSOSEL,"RX")) | 
|---|
|  | 183 | S RX=$P(Z,"^"),REJ=$P(Z,"^",2) I 'RX!'REJ S VALMSG="Invalid selection!",VALMBCK="R" Q | 
|---|
|  | 184 | S PSOCHNG=0 D EN^PSOREJP1(RX,REJ,.PSOCHNG) I $G(PSOCHNG) D REF | 
|---|
|  | 185 | Q | 
|---|
|  | 186 | ; | 
|---|
|  | 187 | EXIT ; | 
|---|
|  | 188 | K ^TMP("PSOREJP0",$J),^TMP("PSOREJSR",$J) | 
|---|
|  | 189 | Q | 
|---|
|  | 190 | ; | 
|---|
|  | 191 | HELP Q | 
|---|
|  | 192 | ; | 
|---|
|  | 193 | SITES() ; - Returns the list of sites along with their NCPDP #s | 
|---|
|  | 194 | N CNT,SITE,SITES,NAME | 
|---|
|  | 195 | I '$D(PSOREJST) Q "" | 
|---|
|  | 196 | I $G(PSOREJST)="ALL" Q "Divisions : ALL" | 
|---|
|  | 197 | S SITE=0 F  S SITE=$O(PSOREJST(SITE)) Q:'SITE  D | 
|---|
|  | 198 | . S NAME=$$GET1^DIQ(59,SITE,.01) | 
|---|
|  | 199 | . S SITES=$G(SITES)_", "_NAME | 
|---|
|  | 200 | S $E(SITES,1,2)="",SITES="Division"_$S($L(SITES,",")>1:"s",1:" ")_" : "_SITES | 
|---|
|  | 201 | Q SITES | 
|---|
|  | 202 | ; | 
|---|
|  | 203 | DIV(RX,FILL) ; - Check if the Division for the Prescription/Fill was selected by the user | 
|---|
|  | 204 | ; | 
|---|
|  | 205 | I $G(PSOREJST)="ALL" Q 1 | 
|---|
|  | 206 | I $D(PSOREJST($$RXSITE^PSOBPSUT(RX,FILL))) Q 1 | 
|---|
|  | 207 | Q 0 | 
|---|
|  | 208 | ; | 
|---|
|  | 209 | PTNAME(RX) ; - Returns header displayable - Patient Name (Last 4 SSN) | 
|---|
|  | 210 | N DFN,VADM,PTNAME | 
|---|
|  | 211 | S DFN=$$GET1^DIQ(52,RX,2,"I") D DEM^VADPT | 
|---|
|  | 212 | S PTNAME=$E($G(VADM(1)),1,18)_"("_$P($P($G(VADM(2)),"^",2),"-",3)_")" | 
|---|
|  | 213 | Q PTNAME | 
|---|
|  | 214 | ; | 
|---|
|  | 215 | FILTER(RX,INS) ; - Filter entries based on user's selection | 
|---|
|  | 216 | N FILTER,NAME | 
|---|
|  | 217 | S FILTER=1 | 
|---|
|  | 218 | I $G(PSOPTFLT)'="ALL",$D(RX),'$D(PSOPTFLT($$GET1^DIQ(52,RX,2,"I"))) Q FILTER | 
|---|
|  | 219 | I $G(PSODRFLT)'="ALL",$D(RX),'$D(PSODRFLT($$GET1^DIQ(52,RX,6,"I"))) Q FILTER | 
|---|
|  | 220 | I $G(PSOINFLT)'="ALL",$D(INS) D  Q FILTER | 
|---|
|  | 221 | . S NAME="" F  S NAME=$O(PSOINFLT(NAME)) Q:NAME=""  I $$UP^XLFSTR(INS)[$$UP^XLFSTR(NAME) S FILTER=0 Q | 
|---|
|  | 222 | Q 0 | 
|---|
|  | 223 | ; | 
|---|
|  | 224 | FLTSTS(RX,REJ) ; - Filter for the Reject Status | 
|---|
|  | 225 | N STS | 
|---|
|  | 226 | S STS=$$GET1^DIQ(52.25,REJ_","_RX,9,"I") | 
|---|
|  | 227 | I PSOSTFLT="U",STS=1 Q 1 | 
|---|
|  | 228 | I PSOSTFLT="R",STS=0 Q 1 | 
|---|
|  | 229 | Q 0 | 
|---|
|  | 230 | ; | 
|---|
|  | 231 | NAME(TYPE) ; - Returns the name if ONE was selected or "MULTIPLE ..." | 
|---|
|  | 232 | N I,CNT | 
|---|
|  | 233 | ; | 
|---|
|  | 234 | I TYPE="P",$O(PSOPTFLT($O(PSOPTFLT(""))))="" Q $$GET1^DIQ(2,$O(PSOPTFLT("")),.01) | 
|---|
|  | 235 | I TYPE="D",$O(PSODRFLT($O(PSODRFLT(""))))="" Q $$GET1^DIQ(50,$O(PSODRFLT("")),.01) | 
|---|
|  | 236 | I TYPE="I",$O(PSOINFLT($O(PSOINFLT(""))))="" Q $O(PSOINFLT("")) | 
|---|
|  | 237 | I TYPE="R" Q $$GET1^DIQ(52,PSORXFLT,.01) | 
|---|
|  | 238 | Q "MULTIPLE "_$S(TYPE="P":"PATIENTS",TYPE="D":"DRUGS",1:"INSURANCE COMPANIES") | 
|---|
|  | 239 | ; | 
|---|
|  | 240 | ENDT() ; Returns the upper limit for the date range | 
|---|
|  | 241 | N ENDT | 
|---|
|  | 242 | S ENDT=$P(PSODTRNG,"^",2) | 
|---|
|  | 243 | I '$E(ENDT,4,7) Q (ENDT+10000) | 
|---|
|  | 244 | I '$E(ENDT,6,7) Q (ENDT+100) | 
|---|
|  | 245 | I $P(ENDT,"^",2) Q (ENDT+0.0000001) | 
|---|
|  | 246 | Q (ENDT+.25) | 
|---|