| [613] | 1 | PSO293PI        ;BIR/MFR-EXPIRATION DATE CLEAN UP ;05/03/07
 | 
|---|
 | 2 |         ;;7.0;OUTPATIENT PHARMACY;**293**;DEC 1997;Build 22
 | 
|---|
 | 3 |         ;External references ^DPT supported by DBIA 10035
 | 
|---|
 | 4 |         ;External reference to STATUS^ORQOR2 is supported by DBIA 3458
 | 
|---|
 | 5 |         ;External reference to ^PS(59.7 is supported by DBIA 694
 | 
|---|
 | 6 |         N NMSP,JOBSTS,DIR,DIRUT,DIROUT,DTOUT,DUOUT,X,Y,ACTION,EXPJOBDT,PSODUZ
 | 
|---|
 | 7 |         S NMSP="PSO293PI"
 | 
|---|
 | 8 |         ;
 | 
|---|
 | 9 |         S JOBSTS=$$JOBSTS^PSO293P1()
 | 
|---|
 | 10 |         ;
 | 
|---|
 | 11 |         W !?5,"Expiration Date clean up job for Outpatient Pharamcy prescriptions"
 | 
|---|
 | 12 |         W !?5,"=================================================================="
 | 
|---|
 | 13 |         W !?5,"Current status: "
 | 
|---|
 | 14 |         W:JOBSTS="N" "NEVER RUN"
 | 
|---|
 | 15 |         W:JOBSTS="S" "STOPPED ON "_$$FMTE^XLFDT($G(^XTMP(NMSP,"STOPPED")))
 | 
|---|
 | 16 |         W:JOBSTS="R" "RUNNING"
 | 
|---|
 | 17 |         W:JOBSTS="C" "COMPLETED ON "_$$FMTE^XLFDT($G(^XTMP(NMSP,"COMPLETED")))
 | 
|---|
 | 18 |         W:JOBSTS="U" "UNKNOWN"
 | 
|---|
 | 19 |         W:$G(^XTMP(NMSP,"LASTRX")) " (Last Rx IEN: "_+$G(^XTMP(NMSP,"LASTRX"))_")"
 | 
|---|
 | 20 |         ;
 | 
|---|
 | 21 |         S DIR(0)="SO^",DIR("A")=""
 | 
|---|
 | 22 |         I JOBSTS="N" D
 | 
|---|
 | 23 |         .S DIR(0)=DIR(0)_"ST:START CLEAN UP JOB;",DIR("A")=DIR("A")_"(ST)Start,",DIR("B")="START"
 | 
|---|
 | 24 |         I JOBSTS="S" D
 | 
|---|
 | 25 |         . S DIR(0)=DIR(0)_"RE:RESUME CLEAN UP JOB;",DIR("A")=DIR("A")_"(RE)Resume,"
 | 
|---|
 | 26 |         I JOBSTS="R" D
 | 
|---|
 | 27 |         . S DIR(0)=DIR(0)_"SP:STOP CLEAN UP JOB;",DIR("A")=DIR("A")_"(SP)Stop,"
 | 
|---|
 | 28 |         I JOBSTS="C" D
 | 
|---|
 | 29 |         . S DIR(0)=DIR(0)_"RR:RE-RUN CLEAN UP JOB;",DIR("A")=DIR("A")_"(RR)Re-run,"
 | 
|---|
 | 30 |         S DIR(0)=DIR(0)_"VW:VIEW "_$S(JOBSTS'="C":"PARTIAL ",1:"")_"CLEAN UP JOB RESULTS;"
 | 
|---|
 | 31 |         S DIR("A")=DIR("A")_"(VW)View,",DIR("B")="VIEW"
 | 
|---|
 | 32 |         S DIR(0)=DIR(0)_"QT:QUIT",DIR("A")=DIR("A")_"(QT)Quit"
 | 
|---|
 | 33 |         D ^DIR I $D(DIRUT)!$D(DIROUT)!$D(DTOUT)!$D(DUOUT) G QUIT
 | 
|---|
 | 34 |         S ACTION=Y
 | 
|---|
 | 35 |         ;
 | 
|---|
 | 36 |         I ACTION="SP" W !!,"This may take a few minutes, please wait..." D  G QUIT
 | 
|---|
 | 37 |         . N TIME,UNABLE
 | 
|---|
 | 38 |         . S ^XTMP(NMSP,"STOP")=1,(TIME,UNABLE)=0
 | 
|---|
 | 39 |         . F  Q:$D(^XTMP(NMSP,"STOPPED"))  D  Q:UNABLE
 | 
|---|
 | 40 |         . . H 1 S TIME=TIME+1
 | 
|---|
 | 41 |         . . I '$D(^XTMP(NMSP,"STOPPED")) D
 | 
|---|
 | 42 |         . . . I $D(^XTMP(NMSP,"COMPLETED"))!($$JOBSTS^PSO293P1()'="R")!(TIME>600) S UNABLE=1
 | 
|---|
 | 43 |         ;
 | 
|---|
 | 44 |         I ACTION="QT" G QUIT
 | 
|---|
 | 45 |         I ACTION="VW" D DISPLAY^PSO293P1 G QUIT
 | 
|---|
 | 46 |         ;
 | 
|---|
 | 47 |         D JOB^PSO293P1()
 | 
|---|
 | 48 |         Q
 | 
|---|
 | 49 |         ;
 | 
|---|
 | 50 | PI      ; Post-Install entry point
 | 
|---|
 | 51 |         N EXPJOBDT,NMSP
 | 
|---|
 | 52 |         S NMSP="PSO293PI"
 | 
|---|
 | 53 |         D LOG^PSO293P1("PATCH INSTALLATION")
 | 
|---|
 | 54 |         S EXPJOBDT=$$GET1^DIQ(59.7,1,49.95,"I")
 | 
|---|
 | 55 |         I 'EXPJOBDT D
 | 
|---|
 | 56 |         . S EXPJOBDT=$$FMADD^XLFDT($$DT^XLFDT(),-2)
 | 
|---|
 | 57 |         . S $P(^PS(59.7,1,49.99),"^",8)=EXPJOBDT
 | 
|---|
 | 58 |         . D LOG^PSO293P1("DATE AUTO-EXPIRE set: "_$$FMTE^XLFDT(EXPJOBDT,2))
 | 
|---|
 | 59 |         S ^XTMP(NMSP,"EXPJOBDT")=EXPJOBDT
 | 
|---|
 | 60 |         ;
 | 
|---|
 | 61 |         D JOB^PSO293P1($$NOW^XLFDT())
 | 
|---|
 | 62 |         Q
 | 
|---|
 | 63 |         ;
 | 
|---|
 | 64 | EN      ;
 | 
|---|
 | 65 |         N NMSP,PSOINST,CUTOFF,PSOACT,RXP,STOP,PSOINACT,PATIENT,COUNTER,RXP,DRUG,STATUS
 | 
|---|
 | 66 |         N ISSUEDT,EXPIRDT,BADRXCNT,DAYSSUP,NUMREFS,PSOPROD,LASTCNT,I
 | 
|---|
 | 67 |         ;
 | 
|---|
 | 68 |         S NMSP="PSO293PI" I '$G(PSODUZ) S PSODUZ=+$G(DUZ)
 | 
|---|
 | 69 |         ;
 | 
|---|
 | 70 |         ; - If can't get Lock, then already running.
 | 
|---|
 | 71 |         L +^XTMP(NMSP):5 I '$T D LOG^PSO293P1("UNSUCCESSFUL (LOCKED)") G QUIT
 | 
|---|
 | 72 |         ;
 | 
|---|
 | 73 |         D SETXTMP
 | 
|---|
 | 74 |         ;
 | 
|---|
 | 75 |         I '$G(DT) S DT=$$DT^XLFDT
 | 
|---|
 | 76 |         S PSOPROD=$$PROD^XUPROD()
 | 
|---|
 | 77 |         ;
 | 
|---|
 | 78 |         S PSOINST=$P($$SITE^VASITE(),"^",2)_" ("_+$$SITE^VASITE()_")"
 | 
|---|
 | 79 |         S CUTOFF=$$GET1^DIQ(59.7,1,49.95,"I") I 'CUTOFF S CUTOFF=$$FMADD^XLFDT(DT,-2)
 | 
|---|
 | 80 |         S PSOINACT=",11,12,13,14,15,"
 | 
|---|
 | 81 |         S RXP=+$G(^XTMP(NMSP,"LASTRX"))
 | 
|---|
 | 82 |         I $G(ACTION)="RE" D
 | 
|---|
 | 83 |         . F I=2:1:12,14 S BADRXCNT(14)=+$G(^XTMP(NMSP,I))
 | 
|---|
 | 84 |         S LASTCNT=+$G(BADRXCNT(14)),STOP=0
 | 
|---|
 | 85 |         F COUNTER=LASTCNT:1 S RXP=$O(^PSRX(RXP)) Q:'RXP  D  Q:STOP
 | 
|---|
 | 86 |         . S:'(COUNTER#10000) DT=$$DT^XLFDT()
 | 
|---|
 | 87 |         . S PATIENT=$P($G(^PSRX(RXP,0)),"^",2)
 | 
|---|
 | 88 |         . S DRUG=$P($G(^PSRX(RXP,0)),"^",6)
 | 
|---|
 | 89 |         . S STATUS=$P($G(^PSRX(RXP,"STA")),"^")
 | 
|---|
 | 90 |         . S ISSUEDT=$P($G(^PSRX(RXP,0)),"^",13)
 | 
|---|
 | 91 |         . S DAYSSUP=$P($G(^PSRX(RXP,0)),"^",8)
 | 
|---|
 | 92 |         . S NUMREFS=$P($G(^PSRX(RXP,0)),"^",9)
 | 
|---|
 | 93 |         . S EXPIRDT=$P($G(^PSRX(RXP,2)),"^",6)
 | 
|---|
 | 94 |         . S BADRXCNT(14)=$G(BADRXCNT(14))+1
 | 
|---|
 | 95 |         . S BADRXCNT("LASTRX")=RXP_"^"_COUNTER
 | 
|---|
 | 96 |         . ;--- SKIP bad Rx's
 | 
|---|
 | 97 |         . I ('PATIENT!'DRUG) Q
 | 
|---|
 | 98 |         . I '$D(^DPT(PATIENT))!('$D(^PSDRUG(DRUG))) Q
 | 
|---|
 | 99 |         . I 'ISSUEDT Q
 | 
|---|
 | 100 |         . ;--- 
 | 
|---|
 | 101 |         . D SET
 | 
|---|
 | 102 |         . ;---
 | 
|---|
 | 103 |         . I '(COUNTER#5000) D
 | 
|---|
 | 104 |         . . M ^XTMP(NMSP)=BADRXCNT
 | 
|---|
 | 105 |         . . I $G(^XTMP(NMSP,"STOP")) S STOP=1
 | 
|---|
 | 106 |         ;
 | 
|---|
 | 107 |         I STOP D STOP G QUIT
 | 
|---|
 | 108 |         ;
 | 
|---|
 | 109 |         M ^XTMP(NMSP)=BADRXCNT
 | 
|---|
 | 110 |         S ^XTMP(NMSP,"COMPLETED")=$$NOW^XLFDT()
 | 
|---|
 | 111 |         K ^XTMP(NMSP,"LASTRX")
 | 
|---|
 | 112 |         D LOG^PSO293P1("COMPLETED")
 | 
|---|
 | 113 |         D MAIL^PSO293P1
 | 
|---|
 | 114 |         ;
 | 
|---|
 | 115 | QUIT    ;
 | 
|---|
 | 116 |         L -^XTMP(NMSP)
 | 
|---|
 | 117 |         Q
 | 
|---|
 | 118 |         ;
 | 
|---|
 | 119 | STOP    ;
 | 
|---|
 | 120 |         K ^XTMP(NMSP,"STOP")
 | 
|---|
 | 121 |         S ^XTMP(NMSP,"STOPPED")=$$NOW^XLFDT()
 | 
|---|
 | 122 |         D LOG^PSO293P1("STOPPED")
 | 
|---|
 | 123 |         D MAIL^PSO293P1
 | 
|---|
 | 124 |         Q
 | 
|---|
 | 125 |         ;
 | 
|---|
 | 126 | SET     ;
 | 
|---|
 | 127 |         N CPRSDC,CPRSTA,NEWEXPDT,DA,DIE,ORN,DR
 | 
|---|
 | 128 |         S CPRSDC=",1,7,12,13,"
 | 
|---|
 | 129 |         ;
 | 
|---|
 | 130 |         ; --- No expiration date on PRESCRIPTION file (#52)
 | 
|---|
 | 131 |         I EXPIRDT="" D  Q
 | 
|---|
 | 132 |         . S ORN=$$CPRSNUM(RXP),CPRSTA=$P(ORN,"^",2),ORN=+ORN
 | 
|---|
 | 133 |         . D SETEXP^PSO293P1 I '$G(EXPIRDT) Q
 | 
|---|
 | 134 |         . I EXPIRDT>CUTOFF D  Q                 ; Expiration Date past Cutoff (will be exp. by auto exp. job), Quit
 | 
|---|
 | 135 |         . . S BADRXCNT(2)=$G(BADRXCNT(2))+1,^XTMP(NMSP,2,RXP)=""
 | 
|---|
 | 136 |         . . D SENDHDR
 | 
|---|
 | 137 |         . I PSOINACT'[(","_STATUS_",") D        ; Foce expiration of Rx (Past Exp. Date)
 | 
|---|
 | 138 |         . . S DA=RXP,DIE=52,DR="100///11",STATUS=11
 | 
|---|
 | 139 |         . . D ^DIE K DIE,DR
 | 
|---|
 | 140 |         . . D RXACT^PSOBPSU2(RXP,0,"Rx status set to EXPIRED by PSO*7*293","E",PSODUZ)
 | 
|---|
 | 141 |         . I ORN D  Q                            ; Rx is expired in CPRS (Update HDR with Exp. Date), Quit 
 | 
|---|
 | 142 |         . . I CPRSDC'[(","_CPRSTA_","),'$D(^PS(52.41,"AQ",RXP)) D  Q
 | 
|---|
 | 143 |         . . . S BADRXCNT(3)=$G(BADRXCNT(3))+1,^XTMP(NMSP,3,RXP)=""
 | 
|---|
 | 144 |         . . . D SENDCPRS()
 | 
|---|
 | 145 |         . . S BADRXCNT(4)=$G(BADRXCNT(4))+1,^XTMP(NMSP,4,RXP)=""
 | 
|---|
 | 146 |         . . D SENDHDR
 | 
|---|
 | 147 |         . I 'ORN D                              ; No CPRS Order # (Update HDR with Exp. Date)
 | 
|---|
 | 148 |         . . S BADRXCNT(5)=$G(BADRXCNT(5))+1,^XTMP(NMSP,5,RXP)=""
 | 
|---|
 | 149 |         . . D SENDHDR
 | 
|---|
 | 150 |         ;
 | 
|---|
 | 151 |         ; --- Rx is expired. Update CPRS and HDR if necessary
 | 
|---|
 | 152 |         I STATUS=11 D  Q
 | 
|---|
 | 153 |         . S ORN=$$CPRSNUM(RXP),CPRSTA=$P(ORN,"^",2),ORN=+ORN
 | 
|---|
 | 154 |         . S NEWEXPDT=0
 | 
|---|
 | 155 |         . I $$FMDIFF^XLFDT(EXPIRDT,ISSUEDT,1)>366 D  ; Expiration Date is > 366, Recalculate new Date
 | 
|---|
 | 156 |         . . S NEWEXPDT=1 D SETEXP^PSO293P1
 | 
|---|
 | 157 |         . I ORN,CPRSDC'[(","_CPRSTA_","),'$D(^PS(52.41,"AQ",RXP)) D  ; Rx is not expired in CPRS (Update CPRS/HDR with Exp. Date), Quit
 | 
|---|
 | 158 |         . . I 'NEWEXPDT S BADRXCNT(6)=$G(BADRXCNT(6))+1,^XTMP(NMSP,6,RXP)=""
 | 
|---|
 | 159 |         . . I NEWEXPDT S BADRXCNT(7)=$G(BADRXCNT(7))+1,^XTMP(NMSP,7,RXP)=""
 | 
|---|
 | 160 |         . . D SENDCPRS()
 | 
|---|
 | 161 |         . I 'NEWEXPDT Q                              ; Expiration Date was not recalculated, don't send to HDR
 | 
|---|
 | 162 |         . S BADRXCNT(8)=$G(BADRXCNT(8))+1,^XTMP(NMSP,8,RXP)=""
 | 
|---|
 | 163 |         . D SENDHDR
 | 
|---|
 | 164 |         ;
 | 
|---|
 | 165 |         I EXPIRDT<CUTOFF,(PSOINACT'[(","_STATUS_",")) D  ; Rx is past exp. date but is still on a non-Expired/DC'd status
 | 
|---|
 | 166 |         . S DA=RXP                                       ; Note: Rx's expiring on or after the CUTOFF will be picked up
 | 
|---|
 | 167 |         . S DIE=52,DR="100///11",STATUS=11               ;       by the Auto Expiration Job.
 | 
|---|
 | 168 |         . D ^DIE K DIE,DR
 | 
|---|
 | 169 |         . D RXACT^PSOBPSU2(RXP,0,"Rx status set to EXPIRED by PSO*7*293","E",PSODUZ)
 | 
|---|
 | 170 |         . S ORN=$$CPRSNUM(RXP),CPRSTA=$P(ORN,"^",2),ORN=+ORN
 | 
|---|
 | 171 |         . I ORN,CPRSDC'[(","_CPRSTA_",") D  Q            ; Update CPRS if necessary, this will also call HDR
 | 
|---|
 | 172 |         . . S BADRXCNT(9)=$G(BADRXCNT(9))+1,^XTMP(NMSP,9,RXP)=""
 | 
|---|
 | 173 |         . . D SENDCPRS()
 | 
|---|
 | 174 |         . I ORN D  Q                                     ; If CPRS was not updated, call HDR if there is an Order #
 | 
|---|
 | 175 |         . . S BADRXCNT(10)=$G(BADRXCNT(10))+1,^XTMP(NMSP,10,RXP)=""
 | 
|---|
 | 176 |         . . D SENDHDR
 | 
|---|
 | 177 |         . I 'ORN D                                       ; If no CPRS Order #, just report (no updates to CPRS/HDR)
 | 
|---|
 | 178 |         . . S BADRXCNT(11)=$G(BADRXCNT(11))+1
 | 
|---|
 | 179 |         . . S ^XTMP(NMSP,11,RXP)=""
 | 
|---|
 | 180 |         ;
 | 
|---|
 | 181 |         I STATUS=13 D  Q
 | 
|---|
 | 182 |         . S ORN=+$$CPRSNUM(RXP)
 | 
|---|
 | 183 |         . I 'ORN D
 | 
|---|
 | 184 |         . . S BADRXCNT(12)=$G(BADRXCNT(12))+1,^XTMP(NMSP,12,RXP)=""
 | 
|---|
 | 185 |         . . D SENDHDR
 | 
|---|
 | 186 |         Q
 | 
|---|
 | 187 |         ;
 | 
|---|
 | 188 | CPRSNUM(RXP)    ;
 | 
|---|
 | 189 |         N ORN,STA
 | 
|---|
 | 190 |         S ORN=$P($G(^PSRX(RXP,"OR1")),"^",2),STA=""
 | 
|---|
 | 191 |         I ORN S STA=+$$STATUS^ORQOR2(ORN) I STA=0 S ORN=""
 | 
|---|
 | 192 |         Q (ORN_"^"_STA)
 | 
|---|
 | 193 |         ;
 | 
|---|
 | 194 | SETXTMP ; - Initialize the XTMP global
 | 
|---|
 | 195 |         I $D(^XTMP(NMSP,"STARTED")) D
 | 
|---|
 | 196 |         . S ^XTMP(NMSP,"RE-STARTED")=$$NOW^XLFDT() D LOG^PSO293P1("RESUMED")
 | 
|---|
 | 197 |         I '$D(^XTMP(NMSP,"STARTED")) D
 | 
|---|
 | 198 |         . S ^XTMP(NMSP,"STARTED")=$$NOW^XLFDT() D LOG^PSO293P1("STARTED")
 | 
|---|
 | 199 |         K ^XTMP(NMSP,"STOP"),^XTMP(NMSP,"STOPPED")
 | 
|---|
 | 200 |         S ^XTMP(NMSP,0)=$$FMADD^XLFDT($$NOW^XLFDT(),730)_"^"_$$NOW^XLFDT()_"^PSO*7*293 - RX EXPIRATION DATE CLEAN UP"
 | 
|---|
 | 201 |         Q
 | 
|---|
 | 202 |         ;
 | 
|---|
 | 203 | SENDCPRS(CPRSONLY)      ; Update CPRS/HDR
 | 
|---|
 | 204 |         N PSOSSMES,TYPE,STS,STSCOM
 | 
|---|
 | 205 |         S:$G(CPRSONLY) PSOSSMES="CPRSUP"
 | 
|---|
 | 206 |         ;
 | 
|---|
 | 207 |         S TYPE="SC",STS="DC",STSCOM="Discontinued"
 | 
|---|
 | 208 |         I STATUS=11 S $P(^PSRX(RXP,0),"^",19)=1,STS="ZE",STSCOM="Expired"
 | 
|---|
 | 209 |         I STATUS=13 S TYPE="OC",STS="",STSCOM="Deleted"
 | 
|---|
 | 210 |         I STATUS=14 S TYPE="OD",STS="RP",STSCOM="Discontinued/Edited"
 | 
|---|
 | 211 |         D EN^PSOHLSN1(RXP,TYPE,STS,"Prescription is "_STSCOM_".")
 | 
|---|
 | 212 |         Q
 | 
|---|
 | 213 |         ;
 | 
|---|
 | 214 | SENDHDR ; Update HDR only
 | 
|---|
 | 215 |         D:$G(PSOPROD) EN^PSOHDR("PRES",RXP)
 | 
|---|
 | 216 |         Q
 | 
|---|