| [613] | 1 | PSOPOST7 ;BIR/EJW,JLC-Post install routine ;10/04/02
 | 
|---|
 | 2 |  ;;7.0;OUTPATIENT PHARMACY;**115,268**;DEC 1997;Build 9
 | 
|---|
 | 3 |  ;External reference to ^DPT supported by DBIA 10035
 | 
|---|
 | 4 |  ;External reference to ^PS(55 supported by DBIA 2228
 | 
|---|
 | 5 |  ; POST-INSTALL ROUTINE FOR PATCH PSO*7*115 - TO RESET MISSING ENTRIES INTO THE PHARMACY PATIENT FILE (#55)
 | 
|---|
 | 6 |  S ZTDTH=""
 | 
|---|
 | 7 |  I $D(ZTQUEUED) S ZTDTH=$H
 | 
|---|
 | 8 |  L +^XTMP("PSOPOST7"):$S(+$G(^DD("DILOCKTM"))>0:+^DD("DILOCKTM"),1:3) I '$T D  Q
 | 
|---|
 | 9 |  . I ZTDTH="" W !,"Clean up job is already running.  Halting..."
 | 
|---|
 | 10 |  L -^XTMP("PSOPOST7")
 | 
|---|
 | 11 |  I ZTDTH="" D
 | 
|---|
 | 12 |  .W !,"The background job to search for missing ^PS(55 entries must be queued."
 | 
|---|
 | 13 |  .W !,"If no start date/time is entered when prompted, the background job will be"
 | 
|---|
 | 14 |  .W !,"queued to run NOW."
 | 
|---|
 | 15 |  .W !
 | 
|---|
 | 16 |  .D BMES^XPDUTL("Queuing background job to search for missing ^PS(55 entries")
 | 
|---|
 | 17 |  S ZTRTN="RES^PSOPOST7",ZTIO="",ZTDESC="Background job to search for missing ^PS(55 entries" D ^%ZTLOAD K ZTDTH,ZTRTN,ZTIO,ZTDESC
 | 
|---|
 | 18 |  W:$D(ZTSK)&('$D(ZTQUEUED)) !!,"Task Queued !",!
 | 
|---|
 | 19 |  Q
 | 
|---|
 | 20 | RES ;
 | 
|---|
 | 21 |  L +^XTMP("PSOPOST7"):$S(+$G(^DD("DILOCKTM"))>0:+^DD("DILOCKTM"),1:3) I '$T S:$D(ZTQUEUED) ZTREQ="@" Q
 | 
|---|
 | 22 |  I '$G(DT) S DT=$$DT^XLFDT
 | 
|---|
 | 23 |  I '$D(^XTMP("PSOPOST7")) S X1=DT,X2=+30 D C^%DTC S ^XTMP("PSOPOST7",0)=$G(X)_"^"_DT
 | 
|---|
 | 24 |  S PSODT2=DT-20000
 | 
|---|
 | 25 |  D NOW^%DTC S ^XTMP("PSOTIMEX","START")=%
 | 
|---|
 | 26 |  D BMES^XPDUTL("Searching for missing ^PS(55 entries...")
 | 
|---|
 | 27 | SRCH ; SEARCH THROUGH PRESCRIPTIONS
 | 
|---|
 | 28 |  N RXP,RX0,PSODFN,PSODT,PSOCTP,PSOCTPA
 | 
|---|
 | 29 |  S (PSOCTP,PSOCTPA)=0
 | 
|---|
 | 30 |  S RXP=0 F  S RXP=$O(^PSRX(RXP)) Q:'RXP  S RX0=$G(^PSRX(RXP,0)),PSODT=$P(RX0,"^",13) I PSODT>PSODT2 S PSODFN=$P(RX0,"^",2) I PSODFN D
 | 
|---|
 | 31 |  .I '$D(^DPT(PSODFN,0)) Q
 | 
|---|
 | 32 |  .D PS55P
 | 
|---|
 | 33 |  .D PS55PA
 | 
|---|
 | 34 |  I $O(^XTMP("PSOPOST7",$J,""))'="" D RESET
 | 
|---|
 | 35 |  N DFN,PSJORD,PSSTART,PSSTOP,PSSTATUS,A
 | 
|---|
 | 36 |  S DFN=0
 | 
|---|
 | 37 |  F  S DFN=$O(^PS(55,DFN)) Q:'DFN  D
 | 
|---|
 | 38 |  . S PSJORD=0 F  S PSJORD=$O(^PS(55,DFN,5,PSJORD)) Q:'PSJORD  D
 | 
|---|
 | 39 |  .. S PSSTATUS=$P($G(^PS(55,DFN,5,PSJORD,0)),U,9),PSSTART=$P($G(^PS(55,DFN,5,PSJORD,2)),U,2),PSSTOP=$P($G(^(2)),U,4) I PSSTOP]"",$D(^PS(55,"AUD",PSSTOP,DFN,PSJORD)) Q
 | 
|---|
 | 40 |  .. K DR S DIE="^PS(55,"_DFN_",5,",DA=PSJORD,DA(1)=DFN,DR="10////^S X=PSSTART;28////^S X=PSSTATUS;34////^S X=PSSTOP"
 | 
|---|
 | 41 |  .. D ^DIE
 | 
|---|
 | 42 |  .. S ^XTMP("PSOPOST7",$J,"UD",DFN,PSJORD)="" K DIE,DR,DA
 | 
|---|
 | 43 |  . S PSJORD=0 F  S PSJORD=$O(^PS(55,DFN,"IV",PSJORD)) Q:'PSJORD  D
 | 
|---|
 | 44 |  .. S A=$G(^PS(55,DFN,"IV",PSJORD,0)) Q:A=""
 | 
|---|
 | 45 |  .. S PSSTART=$P(A,"^",2),PSSTOP=$P(A,"^",3),PSSTATUS=$P(A,"^",17)
 | 
|---|
 | 46 |  .. I PSSTOP]"",$D(^PS(55,"AIV",PSSTOP,DFN,PSJORD)) Q
 | 
|---|
 | 47 |  .. K DR S DIE="^PS(55,"_DFN_",""IV"",",DA=PSJORD,DA(1)=DFN,DR=".02////^S X=PSSTART;.03////^S X=PSSTOP;100////S X=PSSTATUS"
 | 
|---|
 | 48 |  .. D ^DIE
 | 
|---|
 | 49 |  .. S ^XTMP("PSOPOST7",$J,"IV",DFN,PSJORD)="" K DIE,DR,DA
 | 
|---|
 | 50 | MAIL ;
 | 
|---|
 | 51 |  N CNT
 | 
|---|
 | 52 |  D NOW^%DTC S PSOTIMEB=%
 | 
|---|
 | 53 |  S Y=$G(^XTMP("PSOTIMEX","START")) D DD^%DT S PSOTIMEA=Y
 | 
|---|
 | 54 |  S Y=$G(PSOTIMEB) D DD^%DT S PSOTIMEB=Y
 | 
|---|
 | 55 |  S XMDUZ="Patch PSO*7*115",XMY(DUZ)="",XMSUB="PHARMACY PATIENT File (#55) search for missing entries"
 | 
|---|
 | 56 |  K PSOTEXT S PSOTEXT(1)="Patch PSO*7*115 PHARMACY PATIENT File (#55) search and clean-up is complete.",PSOTEXT(2)="It started on "_$G(PSOTIMEA)_".",PSOTEXT(3)="It ended on "_$G(PSOTIMEB)_"."
 | 
|---|
 | 57 |  S PSOTEXT(4)=" "
 | 
|---|
 | 58 |  S PSOTEXT(5)=PSOCTP_" patients had missing ""P"" cross-references"_$S(PSOCTP>0:" and have been reset.",1:".")
 | 
|---|
 | 59 |  S PSOTEXT(6)=PSOCTPA_" ^PS(55,PSODFN,""P"",""A"" cross-references were missing"_$S(PSOCTPA>0:" and have been reset.",1:".")
 | 
|---|
 | 60 |  S PSOTEXT(7)=" "
 | 
|---|
 | 61 |  S CNT=7
 | 
|---|
 | 62 |  I PSOCTP S CNT=CNT+1,PSOTEXT(CNT)="The global ^XTMP(""PSOPOST7"","_$J_",PSODFN,ISSUE DATE,RXIEN) contains" D
 | 
|---|
 | 63 |  .S CNT=CNT+1,PSOTEXT(CNT)="the missing ""P"" cross-reference entries. "_"("_$J_" is the job number.)"
 | 
|---|
 | 64 |  S CNT=CNT+1,PSOTEXT(CNT)=" "
 | 
|---|
 | 65 |  I PSOCTPA S CNT=CNT+1,PSOTEXT(CNT)="The global ^XTMP(""PSOPOST7"","_$J_",PSODFN,""P,A"",EXP. DATE,RXIEN) contains" D
 | 
|---|
 | 66 |  .S CNT=CNT+1,PSOTEXT(CNT)="the missing ""P"",""A"" cross-reference entries. "_"("_$J_" is the job number.)"
 | 
|---|
 | 67 |  I $D(^XTMP("PSOPOST7",$J,"UD")) D
 | 
|---|
 | 68 |  . S CNT=CNT+1,PSOTEXT(CNT)="The global ^XTMP(""PSOPOST7"","_$J_",""UD"",DFN,PSJORD) contains"
 | 
|---|
 | 69 |  . S CNT=CNT+1,PSOTEXT(CNT)="the unit dose orders missing stop dates."
 | 
|---|
 | 70 |  I $D(^XTMP("PSOPOST7",$J,"IV")) D
 | 
|---|
 | 71 |  . S CNT=CNT+1,PSOTEXT(CNT)="The global ^XTMP(""PSOPOST7"","_$J_",""IV"",DFN,PSJORD) contains"
 | 
|---|
 | 72 |  . S CNT=CNT+1,PSOTEXT(CNT)="the IV orders missing stop dates."
 | 
|---|
 | 73 |  S XMTEXT="PSOTEXT(" N DIFROM D ^XMD
 | 
|---|
 | 74 |  K PSOTIMEA,PSOTIMEB,XMDUZ,XMSUB,PSOTEXT,XMTEXT,PSODT2
 | 
|---|
 | 75 |  L -^XTMP("PSOPOST7")
 | 
|---|
 | 76 |  S:$D(ZTQUEUED) ZTREQ="@"
 | 
|---|
 | 77 |  Q
 | 
|---|
 | 78 |  ;
 | 
|---|
 | 79 | PS55P ; CHECK FOR MISSING "P" CROSS=REFERENCES
 | 
|---|
 | 80 |  N PSOSQ
 | 
|---|
 | 81 |  S PSOSQ=0 F  S PSOSQ=$O(^PS(55,PSODFN,"P",PSOSQ)) Q:'PSOSQ  I $G(^PS(55,PSODFN,"P",PSOSQ,0))=RXP Q
 | 
|---|
 | 82 |  I PSOSQ Q
 | 
|---|
 | 83 |  S ^XTMP("PSOPOST7",$J,PSODFN,PSODT,RXP)=""
 | 
|---|
 | 84 |  Q
 | 
|---|
 | 85 |  ;
 | 
|---|
 | 86 | PS55PA ; CHECK FOR MISSING "P","A" CROSS-REFERENCES
 | 
|---|
 | 87 |  N PSODT
 | 
|---|
 | 88 |  S PSODT="" F  S PSODT=$O(^PS(55,PSODFN,"P","A",PSODT)) Q:'PSODT  I $D(^PS(55,PSODFN,"P","A",PSODT,RXP)) Q
 | 
|---|
 | 89 |  I 'PSODT D
 | 
|---|
 | 90 |  . N PSOEXP
 | 
|---|
 | 91 |  . S PSOEXP=$P($G(^PSRX(RXP,2)),"^",6) I PSOEXP="" S PSOEXP=$P($G(^PSRX(RXP,3)),"^",5)
 | 
|---|
 | 92 |  .I PSOEXP="" Q
 | 
|---|
 | 93 |  .S ^XTMP("PSOPOST7",$J,PSODFN,"P,A",PSOEXP,RXP)=""
 | 
|---|
 | 94 |  .D CHKPS
 | 
|---|
 | 95 |  .S ^PS(55,PSODFN,"P","A",PSOEXP,RXP)="",PSOCTPA=PSOCTPA+1
 | 
|---|
 | 96 |  Q
 | 
|---|
 | 97 |  ;
 | 
|---|
 | 98 | CHKPS ; SEE IF ^PS(55,PSODFN EXISTS - IF NOT SET TOP LEVEL AT LEAST
 | 
|---|
 | 99 |  I '$D(^PS(55,PSODFN,0)) S ^PS(55,PSODFN,0)=PSODFN_"^^^^^2"
 | 
|---|
 | 100 |  Q
 | 
|---|
 | 101 |  ;
 | 
|---|
 | 102 | RESET ; RESET "P" CROSS-REFERENCE BY BUILDING ^TMP GLOBAL IN ISSUE DATE SEQUENCE FOR ALL ENTRIES, THEN RESETTING THE "P" SUBSCRIPT
 | 
|---|
 | 103 |  N PSOIDT,PSOSQ,CNT
 | 
|---|
 | 104 |  S PSODFN="" F  S PSODFN=$O(^XTMP("PSOPOST7",$J,PSODFN)) Q:'PSODFN  S PSOCTP=PSOCTP+1 D
 | 
|---|
 | 105 |  .K ^TMP("PSOPOST7",$J)
 | 
|---|
 | 106 |  .S CNT=0
 | 
|---|
 | 107 |  .I '$O(^XTMP("PSOPOST7",$J,PSODFN,"")) Q  ; quit if only "P,A" entries
 | 
|---|
 | 108 |  .L +^PS(55,PSODFN):$S(+$G(^DD("DILOCKTM"))>0:+^DD("DILOCKTM"),1:3)
 | 
|---|
 | 109 |  .S PSODT="" F  S PSODT=$O(^XTMP("PSOPOST7",$J,PSODFN,PSODT)) Q:'PSODT    S RXP="" F  S RXP=$O(^XTMP("PSOPOST7",$J,PSODFN,PSODT,RXP)) Q:'RXP  D
 | 
|---|
 | 110 |  ..S PSOIDT=$P($G(^PSRX(RXP,0)),"^",13) I PSOIDT'="" I '$D(^TMP("PSOPOST7",$J,PSOIDT,RXP)) S ^TMP("PSOPOST7",$J,PSOIDT,RXP)="",CNT=CNT+1
 | 
|---|
 | 111 |  .S PSOSQ=0 F  S PSOSQ=$O(^PS(55,PSODFN,"P",PSOSQ)) Q:'PSOSQ  D  ; NOW ADD ALL EXISTING ENRIES TO ^TMP GLOBAL
 | 
|---|
 | 112 |  ..S RXP=$G(^PS(55,PSODFN,"P",PSOSQ,0)) I RXP="" Q
 | 
|---|
 | 113 |  ..S PSOIDT=$P($G(^PSRX(RXP,0)),"^",13) I PSOIDT'=""  I '$D(^TMP("PSOPOST7",$J,PSOIDT,RXP)) S ^TMP("PSOPOST7",$J,PSOIDT,RXP)="",CNT=CNT+1
 | 
|---|
 | 114 |  .I $O(^PS(55,PSODFN,"P",CNT)) D
 | 
|---|
 | 115 |  ..S PSOSQ=CNT F  S PSOSQ=$O(^PS(55,PSODFN,"P",PSOSQ)) Q:'PSOSQ  K ^PS(55,PSODFN,"P",PSOSQ) ; REMOVE SEQUENCE NUMBERS THAT ARE GREATER THAN THE NUMBER OF "P" ENTRIES
 | 
|---|
 | 116 |  .S CNT=0,PSOIDT="" F  S PSOIDT=$O(^TMP("PSOPOST7",$J,PSOIDT)) Q:'PSOIDT  S RXP=""  F  S RXP=$O(^TMP("PSOPOST7",$J,PSOIDT,RXP)) Q:'RXP  S CNT=CNT+1,^PS(55,PSODFN,"P",CNT,0)=RXP
 | 
|---|
 | 117 |  .I CNT>0 S ^PS(55,PSODFN,"P",0)="^55.03PA^"_CNT_"^"_CNT
 | 
|---|
 | 118 |  .L -^PS(55,PSODFN)
 | 
|---|
 | 119 |  K ^TMP("PSOPOST7",$J)
 | 
|---|
 | 120 |  Q
 | 
|---|
 | 121 |  ;
 | 
|---|