| 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)
 | 
|---|