| [613] | 1 | PSOCPBK1 ;BIR/EJW,GN-Tally unbilled Automated-release refill copays ;8/10/05 12:50pm | 
|---|
|  | 2 | ;;7.0;OUTPATIENT PHARMACY;**215**;DEC 1997 | 
|---|
|  | 3 | ;External reference to ^XUSEC supported by DBIA 10076 | 
|---|
|  | 4 | ;External reference to IBARX supported by DBIA 125 | 
|---|
|  | 5 | ;External reference to $$PROD^XUPROD(1) supported by DBIA 4440 | 
|---|
|  | 6 | ; | 
|---|
|  | 7 | N DTOUT,DUOUT,ZTSK,ZTRTN,ZTIO,ZTDTH,ZTDESC | 
|---|
|  | 8 | I '$D(XPDQUES("POS1")) D  Q:'ZTDTH | 
|---|
|  | 9 | .K DIR | 
|---|
|  | 10 | .S DIR("A")="Enter when to Queue the Tally job to run in date@time format " | 
|---|
|  | 11 | .S DIR("B")="NOW" | 
|---|
|  | 12 | .S DIR(0)="D^::%DT" | 
|---|
|  | 13 | .S DIR("?")="Enter when to start the job. The default is Now. You can enter a date and time in the format like this: 081505@3:30p" | 
|---|
|  | 14 | .D ^DIR I $D(DTOUT)!($D(DUOUT)) W !,"Halting..." S ZTDTH="" Q | 
|---|
|  | 15 | .S ZTDTH=$$FMTH^XLFDT(Y) | 
|---|
|  | 16 | ; | 
|---|
|  | 17 | I $D(XPDQUES("POS1")) S ZTDTH=$$FMTH^XLFDT(XPDQUES("POS1")) | 
|---|
|  | 18 | ; | 
|---|
|  | 19 | D BMES^XPDUTL("===================================================") | 
|---|
|  | 20 | D MES^XPDUTL("Queuing background job to tally unbilled refills...") | 
|---|
|  | 21 | D MES^XPDUTL("Start time: "_$$HTE^XLFDT(ZTDTH)) | 
|---|
|  | 22 | D MES^XPDUTL("===================================================") | 
|---|
|  | 23 | L +^XTMP($$NAMSP):0 I '$T D  Q | 
|---|
|  | 24 | . I ZTDTH="" D BMES^XPDUTL("Tally job is already running.  Halting...") | 
|---|
|  | 25 | L -^XTMP($$NAMSP) | 
|---|
|  | 26 | S ZTRTN="EN^PSOCPBK1",ZTIO="" | 
|---|
|  | 27 | S ZTDESC="Background job to tally unbilled copays for refills via OPAI" | 
|---|
|  | 28 | D ^%ZTLOAD | 
|---|
|  | 29 | D:$D(ZTSK) | 
|---|
|  | 30 | .D BMES^XPDUTL("=========================") | 
|---|
|  | 31 | .D MES^XPDUTL("Task #"_ZTSK_" Queued!") | 
|---|
|  | 32 | .D MES^XPDUTL("=========================") | 
|---|
|  | 33 | .D BMES^XPDUTL("") | 
|---|
|  | 34 | D BMES^XPDUTL("") | 
|---|
|  | 35 | K XPDQUES | 
|---|
|  | 36 | Q | 
|---|
|  | 37 | EN ; | 
|---|
|  | 38 | N NAMSP S NAMSP=$$NAMSP | 
|---|
|  | 39 | ;if can't get Lock, then already running. | 
|---|
|  | 40 | L +^XTMP(NAMSP):3 I '$T S:$D(ZTQUEUED) ZTREQ="@" Q | 
|---|
|  | 41 | ;if got a lock then must be fresh start, kill possible old Xtmp | 
|---|
|  | 42 | K ^XTMP(NAMSP) | 
|---|
|  | 43 | N PSODT,RXP,PSOTEXT,XX,YY,PSOCNT,PSOSTART,PSOEND,PSOVETS,PSOTRX,XIEN | 
|---|
|  | 44 | N PSOSCMX,PSODFN,PSOREL,PSOAMT,FOUND,V24,PSOTRF,PSOEND2,PSOSTRT2,QQ | 
|---|
|  | 45 | N PSOTIME,PSOSTNM,PSOS1,PSOINST,I,PSOTC,PSOCNTS,LIN,%,X1,XMY,STOP | 
|---|
|  | 46 | D NOW^%DTC S (Y,PSOS1)=% D DD^%DT S PSOSTART=Y | 
|---|
|  | 47 | S PSOSTRT2=$$FMTE^XLFDT(%,"1PS") | 
|---|
|  | 48 | I '$G(DT) S DT=$$DT^XLFDT | 
|---|
|  | 49 | I '$D(^XTMP(NAMSP)) S X1=DT D C^%DTC S ^XTMP(NAMSP,0)=$G(X)_"^"_DT_"^Tally of unbilled copays for refills via OPAI, PSO*7*215" | 
|---|
|  | 50 | ; | 
|---|
|  | 51 | ;get 1st occurence of install date of patch PSO*7*156 (OPAI) | 
|---|
|  | 52 | S XIEN=+$O(^XPD(9.7,"B","PSO*7.0*156",0)) | 
|---|
|  | 53 | S PSODT=+$P($G(^XPD(9.7,XIEN,1)),"^",3) | 
|---|
|  | 54 | I 'PSODT S ^XTMP(NAMSP,0,.1)="OPAI PATCH PSO*7*156 IS NOT INSTALLED" D MAIL3^PSOCPBK2(^XTMP(NAMSP,0,.1)) Q | 
|---|
|  | 55 | ; | 
|---|
|  | 56 | ;check if any division is on v2.4 (OPAI interface) | 
|---|
|  | 57 | S V24=0 | 
|---|
|  | 58 | F XX=0:0 S XX=$O(^PS(59,XX)) Q:'XX  D  Q:V24 | 
|---|
|  | 59 | . S:+$G(^PS(59,XX,"DISP"))=2.4 V24=1 | 
|---|
|  | 60 | I 'V24 D  Q | 
|---|
|  | 61 | . S ^XTMP(NAMSP,0,.2)="OPAI IS INSTALLED BUT IS NOT TURNED ON" | 
|---|
|  | 62 | . D MAIL3^PSOCPBK2(^XTMP(NAMSP,0,.2)) | 
|---|
|  | 63 | ; | 
|---|
|  | 64 | S (PSOTRX,PSOTRF)=1 | 
|---|
|  | 65 | K ^XTMP(NAMSP,0,"STOP") S STOP=0                 ;init stop flag to 0 | 
|---|
|  | 66 | F QQ=1:1 S PSODT=$O(^PSRX("AL",PSODT)) Q:'PSODT  D  Q:STOP | 
|---|
|  | 67 | .I QQ#100=0,$D(^XTMP(NAMSP,0,"STOP")) K ^XTMP(NAMSP) S STOP=1 Q | 
|---|
|  | 68 | .S RXP="" | 
|---|
|  | 69 | .F PSOTRX=PSOTRX+1:1 S RXP=$O(^PSRX("AL",PSODT,RXP)) Q:'RXP  D | 
|---|
|  | 70 | ..;save last date & fill info | 
|---|
|  | 71 | ..S ^XTMP(NAMSP,0,"LAST")=PSODT_"^"_RXP_"^"_PSOTRX | 
|---|
|  | 72 | ..S PSODFN=$P($G(^PSRX(RXP,0)),"^",2) | 
|---|
|  | 73 | ..Q:('PSODFN)!('$D(^DPT(PSODFN,0)))         ;quit, no valid DFN info | 
|---|
|  | 74 | ..D XTYPE | 
|---|
|  | 75 | ..Q:+PSOSCMX=0                              ;quit, Exempt or deceased | 
|---|
|  | 76 | ..;search refills only, ignore 0=orig fill | 
|---|
|  | 77 | ..F YY=0:0 S YY=$O(^PSRX("AL",PSODT,RXP,YY)) Q:'YY  D ADDBILL | 
|---|
|  | 78 | Q:STOP | 
|---|
|  | 79 | ; | 
|---|
|  | 80 | S PSOCNT=0 | 
|---|
|  | 81 | D TALLY^PSOCPBK2 Q:STOP | 
|---|
|  | 82 | D TOTAL | 
|---|
|  | 83 | D MAIL | 
|---|
|  | 84 | D MAIL2 | 
|---|
|  | 85 | L -^XTMP(NAMSP) | 
|---|
|  | 86 | S:$D(ZTQUEUED) ZTREQ="@" | 
|---|
|  | 87 | Q | 
|---|
|  | 88 | ; | 
|---|
|  | 89 | ADDBILL ;add to billable ^XTMP if ok, quit if not | 
|---|
|  | 90 | S PSOTRF=PSOTRF+1 | 
|---|
|  | 91 | S PSOREL=$P($G(^PSRX(RXP,1,YY,0)),"^",18) | 
|---|
|  | 92 | Q:'PSOREL                                   ;not released | 
|---|
|  | 93 | Q:'YY                                       ;orig fill | 
|---|
|  | 94 | Q:+$$RXST^IBARXEU(PSODFN,$P(PSOREL,"."))    ;Exempt on Rel dte | 
|---|
|  | 95 | ;check refill | 
|---|
|  | 96 | Q:$P($G(^PSRX(RXP,1,YY,"IB")),"^",1)'=""    ;already billed | 
|---|
|  | 97 | Q:$P($G(^PSRX(RXP,1,YY,"IB")),"^",2)'=""    ;exceeded ann. cap | 
|---|
|  | 98 | ; | 
|---|
|  | 99 | ;look for Activity log entry per refill # with the below text | 
|---|
|  | 100 | S FOUND=0 | 
|---|
|  | 101 | F XX=999:0 S XX=$O(^PSRX(RXP,"A",XX),-1) Q:'XX  D  Q:FOUND | 
|---|
|  | 102 | .Q:$P(^PSRX(RXP,"A",XX,0),"^",4)'=YY | 
|---|
|  | 103 | .Q:^PSRX(RXP,"A",XX,0)'["External Interface Dispensing is Complete" | 
|---|
|  | 104 | .S FOUND=1 | 
|---|
|  | 105 | Q:'FOUND | 
|---|
|  | 106 | ; | 
|---|
|  | 107 | S ^XTMP(NAMSP,PSODFN,RXP,YY)=$P(PSOREL,".")  ;add to XTMP to be bill | 
|---|
|  | 108 | Q | 
|---|
|  | 109 | ; | 
|---|
|  | 110 | MAIL ; | 
|---|
|  | 111 | N TOTAMT,PSOCXPDA | 
|---|
|  | 112 | D NOW^%DTC S Y=% D DD^%DT S PSOEND=Y | 
|---|
|  | 113 | S PSOEND2=$$FMTE^XLFDT(%,"1PS") | 
|---|
|  | 114 | I $G(DUZ) S XMY(DUZ)="" | 
|---|
|  | 115 | S XMDUZ="Outpatient Pharmacy",XMSUB="Outpatient Pharmacy Copay Tally" | 
|---|
|  | 116 | F PSOCXPDA=0:0 S PSOCXPDA=$O(^XUSEC("PSO COPAY",PSOCXPDA)) Q:'PSOCXPDA  S XMY(PSOCXPDA)="" | 
|---|
|  | 117 | I $O(XMY(""))="" Q  ; no recipients for mail message | 
|---|
|  | 118 | S PSOTEXT(1)="The Rx copay tally job for the Outpatient Pharmacy patch (PSO*7*215)" | 
|---|
|  | 119 | S PSOTEXT(2)="started "_PSOSTART_" and completed "_PSOEND_"." | 
|---|
|  | 120 | I PSOCNT=0 S PSOTEXT(3)="No released unbilled copay fills were found." | 
|---|
|  | 121 | I PSOCNT>0 D | 
|---|
|  | 122 | .S TOTAMT=0 | 
|---|
|  | 123 | .F XX="YR2004","YR2005" D | 
|---|
|  | 124 | ..F YY=1:1:3 S PSOAMT(XX,YY)=PSOCNT(XX,YY)*YY*7,TOTAMT=TOTAMT+PSOAMT(XX,YY) | 
|---|
|  | 125 | .S PSOTEXT(3)="Auto-Released refills have now been marked as potentials for back billing." | 
|---|
|  | 126 | .S PSOTEXT(4)="There were "_$FN(PSOCNT,",")_" fills successfully tallied for "_$FN(PSOVETS,",")_" veterans." | 
|---|
|  | 127 | .S PSOTEXT(5)=" " | 
|---|
|  | 128 | .S PSOTEXT(6)="Fills eligible for back-billing by year:" | 
|---|
|  | 129 | .S PSOTEXT(7)="2004  30-DAY EQUIVALENT FILLS: "_$J(PSOCNT("YR2004",1),6) | 
|---|
|  | 130 | .S PSOTEXT(7)=PSOTEXT(7)_"     $"_$J($FN(PSOAMT("YR2004",1),","),9) | 
|---|
|  | 131 | .S PSOTEXT(8)="2004  60-DAY EQUIVALENT FILLS: "_$J(PSOCNT("YR2004",2),6) | 
|---|
|  | 132 | .S PSOTEXT(8)=PSOTEXT(8)_"     $"_$J($FN(PSOAMT("YR2004",2),","),9) | 
|---|
|  | 133 | .S PSOTEXT(9)="2004  90-DAY EQUIVALENT FILLS: "_$J(PSOCNT("YR2004",3),6) | 
|---|
|  | 134 | .S PSOTEXT(9)=PSOTEXT(9)_"     $"_$J($FN(PSOAMT("YR2004",3),","),9) | 
|---|
|  | 135 | .S PSOTEXT(10)="" | 
|---|
|  | 136 | .S PSOTEXT(11)="2005  30-DAY EQUIVALENT FILLS: "_$J(PSOCNT("YR2005",1),6) | 
|---|
|  | 137 | .S PSOTEXT(11)=PSOTEXT(11)_"     $"_$J($FN(PSOAMT("YR2005",1),","),9) | 
|---|
|  | 138 | .S PSOTEXT(12)="2005  60-DAY EQUIVALENT FILLS: "_$J(PSOCNT("YR2005",2),6) | 
|---|
|  | 139 | .S PSOTEXT(12)=PSOTEXT(12)_"     $"_$J($FN(PSOAMT("YR2005",2),","),9) | 
|---|
|  | 140 | .S PSOTEXT(13)="2005  90-DAY EQUIVALENT FILLS: "_$J(PSOCNT("YR2005",3),6) | 
|---|
|  | 141 | .S PSOTEXT(13)=PSOTEXT(13)_"     $"_$J($FN(PSOAMT("YR2005",3),","),9) | 
|---|
|  | 142 | .S PSOTEXT(14)="                                          ==========" | 
|---|
|  | 143 | .S PSOTEXT(15)="                                    TOTAL $"_$J($FN(TOTAMT,","),9) | 
|---|
|  | 144 | .S PSOTEXT(16)=" " | 
|---|
|  | 145 | .S PSOTEXT(17)="To get a report of patients/prescriptions that were identified as potentially" | 
|---|
|  | 146 | .S PSOTEXT(18)="billable as part of this Tally, enter D RPT^PSOCPBK2 at the programmer's prompt" | 
|---|
|  | 147 | S XMTEXT="PSOTEXT(" N DIFROM D ^XMD K XMDUZ,XMTEXT,XMSUB | 
|---|
|  | 148 | Q | 
|---|
|  | 149 | ; | 
|---|
|  | 150 | MAIL2 ; | 
|---|
|  | 151 | S LIN="",$P(LIN," ",80)="" | 
|---|
|  | 152 | D NOW^%DTC S PSOTIME=$$FMDIFF^XLFDT(%,$G(PSOS1),2) | 
|---|
|  | 153 | S PSOINST=$P($G(^DIC(4,+$P($G(^XMB(1,1,"XUS")),"^",17),99)),"^") | 
|---|
|  | 154 | S PSOSTNM=$P($G(^DIC(4,PSOINST,0)),"^") | 
|---|
|  | 155 | K PSOTEXT | 
|---|
|  | 156 | S XMY(DUZ)="",PSOTC=0,PSOCNTS="" | 
|---|
|  | 157 | F J="YR2004","YR2005" F I=1:1:3 D | 
|---|
|  | 158 | .S PSOTC=PSOTC+PSOCNT(J,I) | 
|---|
|  | 159 | .S PSOCNTS=PSOCNTS_","_PSOCNT(J,I) | 
|---|
|  | 160 | S XMY("NAPOLIELLO.GREG@FORUM.VA.GOV")="" | 
|---|
|  | 161 | S XMY("WHITE.ELAINE@FORUM.VA.GOV")="" | 
|---|
|  | 162 | S:$$PROD^XUPROD(1) XMY("WILLIAMSON.ERIC@FORUM.VA.GOV")="" | 
|---|
|  | 163 | S XMDUZ="PSO*7*215 TALLY" | 
|---|
|  | 164 | S XMSUB="STATION "_$G(PSOINST) | 
|---|
|  | 165 | S XMSUB=XMSUB_$S($$PROD^XUPROD(1):"(Prod)",1:"(Test)") | 
|---|
|  | 166 | S XMSUB=XMSUB_" UNBILLED COPAYS FOR PRESCRIPTION REFILLS" | 
|---|
|  | 167 | S PSOTEXT(1)="               Start time: "_PSOSTRT2 | 
|---|
|  | 168 | S PSOTEXT(2)="           Completed time: "_PSOEND2 | 
|---|
|  | 169 | S PSOTEXT(3)="             Elapsed Time: "_$$ETIME^PSOCPBK2(PSOTIME) | 
|---|
|  | 170 | S PSOTEXT(4)="" | 
|---|
|  | 171 | S PSOTEXT(5)="     Total RX's processed: "_$J($FN(PSOTRX,","),8) | 
|---|
|  | 172 | S PSOTEXT(6)="  Total Refills processed: "_$J($FN(PSOTRF,","),8) | 
|---|
|  | 173 | S PSOTEXT(7)="   Total billable refills: "_$J($FN(PSOTC,","),8) | 
|---|
|  | 174 | S PSOTEXT(8)="      Total billable vets: "_$J($FN(PSOVETS,","),8) | 
|---|
|  | 175 | S PSOTEXT(9)="" | 
|---|
|  | 176 | S PSOTEXT(10)="Excel comma delimited data below, Two heading, one data line" | 
|---|
|  | 177 | S PSOTEXT(11)="" | 
|---|
|  | 178 | S PSOTEXT(12)="Copy and paste any of the 2 heading & 1 data rows into Excel.  Then click " | 
|---|
|  | 179 | S PSOTEXT(13)="'Data', 'Text to Columns..', check 'Delimited', click Next, check 'Comma'," | 
|---|
|  | 180 | S PSOTEXT(14)="and click Finish" | 
|---|
|  | 181 | S PSOTEXT(15)="" | 
|---|
|  | 182 | S PSOTEXT(16)=$E(("Station,Station,,2004,,,2005"_LIN),1,79) | 
|---|
|  | 183 | S PSOTEXT(17)=$E(("Name,#,30 days,60 days,90 days,30 days,60 days,90 days"_LIN),1,79) | 
|---|
|  | 184 | S PSOTEXT(18)=$E((PSOSTNM_","_PSOINST_PSOCNTS_LIN),1,79) | 
|---|
|  | 185 | S PSOTEXT(19)="" | 
|---|
|  | 186 | S XMTEXT="PSOTEXT(" N DIFROM D ^XMD K XMDUZ,XMTEXT,XMSUB | 
|---|
|  | 187 | Q | 
|---|
|  | 188 | ; | 
|---|
|  | 189 | XTYPE ; | 
|---|
|  | 190 | N Y,VADM,I,J,X,SAVY,DFN | 
|---|
|  | 191 | S DFN=PSODFN D DEM^VADPT I +$G(VADM(6)) S PSOSCMX="" Q  ; DECEASED | 
|---|
|  | 192 | S (X,PSOSCMX,SAVY)="" | 
|---|
|  | 193 | S J=0 F  S J=$O(^PS(59,J)) Q:'J  I +$G(^(J,"IB")) S X=+^("IB") Q | 
|---|
|  | 194 | I 'X Q | 
|---|
|  | 195 | S X=X_"^"_PSODFN D XTYPE^IBARX | 
|---|
|  | 196 | I $G(Y)'=1 Q | 
|---|
|  | 197 | S J="" F  S J=$O(Y(J)) Q:'J  S I="" F  S SAVY=I,I=$O(Y(J,I)) Q:I=""  S:I>0 PSOSCMX=I | 
|---|
|  | 198 | I PSOSCMX="",SAVY=0 Q  ; INCOME EXEMPT OR SERVICE-CONNECTED | 
|---|
|  | 199 | I PSOSCMX=2 Q  ; NEED TO ASK SC QUESTION | 
|---|
|  | 200 | Q | 
|---|
|  | 201 | ; | 
|---|
|  | 202 | TOTAL ; | 
|---|
|  | 203 | N COUNT,COUNTED | 
|---|
|  | 204 | I '$D(PSOVETS) S PSOVETS=0 | 
|---|
|  | 205 | N I,J | 
|---|
|  | 206 | F I=1:1:3 S (PSOCNT("YR2004",I),PSOCNT("YR2005",I))=0 | 
|---|
|  | 207 | S PSODFN=0 F  S PSODFN=$O(^XTMP(NAMSP,PSODFN)) Q:'PSODFN  D | 
|---|
|  | 208 | .S COUNTED=0 | 
|---|
|  | 209 | .F J="YR2004","YR2005" F I=1:1:3 S COUNT=$G(^XTMP(NAMSP,PSODFN,J,I)) I COUNT>0 S:'$G(COUNTED) COUNTED=1,PSOVETS=PSOVETS+1 S PSOCNT(J,I)=PSOCNT(J,I)+COUNT | 
|---|
|  | 210 | F I=1:1:3 S PSOCNT=PSOCNT+PSOCNT("YR2004",I)+PSOCNT("YR2005",I) | 
|---|
|  | 211 | Q | 
|---|
|  | 212 | ; | 
|---|
|  | 213 | STATUS ;show status of job running | 
|---|
|  | 214 | I $$ST D | 
|---|
|  | 215 | .W !,"Currently processing:" | 
|---|
|  | 216 | .W !?5,"Released Date > ",+^XTMP($$NAMSP,0,"LAST") | 
|---|
|  | 217 | .W !?5,"         RX # > ",$P(^XTMP($$NAMSP,0,"LAST"),"^",2) | 
|---|
|  | 218 | .W !?5,"   TOTAL RX's > ",$P(^XTMP($$NAMSP,0,"LAST"),"^",3),! | 
|---|
|  | 219 | Q | 
|---|
|  | 220 | ; | 
|---|
|  | 221 | STOP ;stop job command | 
|---|
|  | 222 | I $$ST S ^XTMP($$NAMSP,0,"STOP")="" D | 
|---|
|  | 223 | .W !,"Outpatient RX Copay Tally Job - set to STOP Soon" | 
|---|
|  | 224 | .W !!,"Check Status to be sure it has stopped and is not running..." | 
|---|
|  | 225 | .W !,"     (D STATUS^PSOCPBK1)" | 
|---|
|  | 226 | Q | 
|---|
|  | 227 | ST() ;status | 
|---|
|  | 228 | L +^XTMP($$NAMSP):3 I $T D  Q 0 | 
|---|
|  | 229 | .L -^XTMP($$NAMSP) | 
|---|
|  | 230 | .W !,"*** TALLY NOT CURRENTLY RUNNING! ***",! | 
|---|
|  | 231 | Q 1 | 
|---|
|  | 232 | NAMSP() ; | 
|---|
|  | 233 | Q $T(+0) | 
|---|