| 1 | PSUAR1 ;BIR/PDW - Start AR/WS Extract ;11 AUG 1999
 | 
|---|
| 2 |  ;;4.0;PHARMACY BENEFITS MANAGEMENT;;MARCH, 2005
 | 
|---|
| 3 |  ;;
 | 
|---|
| 4 |  ;PSUDTDA - IEN FOR DATE
 | 
|---|
| 5 |  ;PSUSDA - IEN FOR INPATIENT SITE
 | 
|---|
| 6 |  ;PSUDRDA - IEN FOR DRUG
 | 
|---|
| 7 |  ;PSUCDA - IEN FOR CATEGORY
 | 
|---|
| 8 |  ;PSUDIV - IEN FOR DIVISION OR "NONE"
 | 
|---|
| 9 |  ;
 | 
|---|
| 10 |  ;DBIAs
 | 
|---|
| 11 |  ; Reference to file #58.5  supported by DBIA 456
 | 
|---|
| 12 |  ; Reference to file #58.1  supported by DBIA 2515
 | 
|---|
| 13 |  ; Reference to file #59.4  supported by DBIA 2498
 | 
|---|
| 14 |  ; Reference to file #44    supported by DBIA 2439
 | 
|---|
| 15 |  ; Reference to file #40.8  supported by DBIA 2438
 | 
|---|
| 16 |  ; Reference to file #59    supported by DBIA 1876
 | 
|---|
| 17 |  ; Reference to file #59.7  supported by DBIA 2854
 | 
|---|
| 18 |  ;
 | 
|---|
| 19 | EN ;EP MAIN ENTRY POINT
 | 
|---|
| 20 |  ;
 | 
|---|
| 21 |  K PSUTDSP,PSUTRET
 | 
|---|
| 22 |  ;
 | 
|---|
| 23 | START ;Start date scan thru stats file
 | 
|---|
| 24 |  S PSUSDT=PSUSDT-.1
 | 
|---|
| 25 |  S PSUDT=PSUSDT
 | 
|---|
| 26 |  S PSUEDT=PSUEDT\1+.24
 | 
|---|
| 27 | Q F  S PSUDT=$O(^PSI(58.5,"B",PSUDT)) Q:'PSUDT  Q:PSUDT>PSUEDT  D DATE Q:$G(PSUQUIT)
 | 
|---|
| 28 |  Q
 | 
|---|
| 29 | DATE ;PROCESS ONE DATE - Loop through inpatient sites
 | 
|---|
| 30 |  S PSUDTDA=$O(^PSI(58.5,"B",PSUDT,0))
 | 
|---|
| 31 |  K PSUSITE
 | 
|---|
| 32 |  D GETM^PSUTL(58.5,PSUDTDA,"1*^.01","PSUSITE")
 | 
|---|
| 33 |  S PSUSDA=0
 | 
|---|
| 34 |  F  S PSUSDA=$O(PSUSITE(PSUSDA)) Q:PSUSDA'>0  D SITE Q:$G(PSUQUIT)
 | 
|---|
| 35 |  K PSUSITE
 | 
|---|
| 36 |  Q
 | 
|---|
| 37 |  ;
 | 
|---|
| 38 | SITE ;Process one site for one date
 | 
|---|
| 39 |  ; Find division for site for loading drug stats
 | 
|---|
| 40 |  S PSUDIV=$$DIV(PSUSDA,PSUDTDA)
 | 
|---|
| 41 |  ;
 | 
|---|
| 42 |  I PSUDIV="NULL" S PSUDIV=PSUSNDR
 | 
|---|
| 43 |  ;
 | 
|---|
| 44 |  ;    Process individual Drug information from 58.52
 | 
|---|
| 45 |  ;    Drug multiple loaded into PSUDRUG
 | 
|---|
| 46 |  K PSUDRUG
 | 
|---|
| 47 |  D GETM^PSUTL(58.501,"PSUDTDA,PSUSDA","2*^.01","PSUDRUG")
 | 
|---|
| 48 |  S PSUDRDA=0
 | 
|---|
| 49 |  F  S PSUDRDA=$O(PSUDRUG(PSUDRDA)) Q:PSUDRDA'>0  D DRUG Q:$G(PSUQUIT)
 | 
|---|
| 50 |  K PSUDRUG
 | 
|---|
| 51 |  ;
 | 
|---|
| 52 |  D MAP
 | 
|---|
| 53 |  ;    Process Amis categories from 58.501
 | 
|---|
| 54 |  ;    Category multiple loaded into PSUCAT
 | 
|---|
| 55 |  K PSUCAT
 | 
|---|
| 56 | CATEGORY ;EP Pull Categories
 | 
|---|
| 57 |  K PSUAMCAT
 | 
|---|
| 58 |  D GETM^PSUTL(58.501,"PSUDTDA,PSUSDA","1*^.01;1;2;3;4","PSUAMCAT","I")
 | 
|---|
| 59 |  ;
 | 
|---|
| 60 |  ;    Move (da,Fld,"I") values to (da,Fld) nodes
 | 
|---|
| 61 |  D MOVEMI^PSUTL("PSUAMCAT")
 | 
|---|
| 62 |  ;
 | 
|---|
| 63 |  ;   Gather totals for categories and accumulate in
 | 
|---|
| 64 |  ;   ^XTMP(PSUARSUB,"DIV_CAT",PSUDIV,PSUAMCAT,"DISP":COST")
 | 
|---|
| 65 |  N PSUDISP,PSUCOST
 | 
|---|
| 66 |  S PSUCDA=0 F  S PSUCDA=$O(PSUAMCAT(PSUCDA)) Q:PSUCDA'>0  D
 | 
|---|
| 67 |  . S PSUDISP=PSUAMCAT(PSUCDA,1)-PSUAMCAT(PSUCDA,3)
 | 
|---|
| 68 |  . S PSUCOST=PSUAMCAT(PSUCDA,2)-PSUAMCAT(PSUCDA,4)
 | 
|---|
| 69 |  . S PSUAMCAT=PSUAMCAT(PSUCDA,.01) ; "03"-"04"-"06" etc
 | 
|---|
| 70 |  . S X=$G(^XTMP(PSUARSUB,"DIV_CAT",PSUDIV,PSUAMCAT,"DISP"))
 | 
|---|
| 71 |  . S ^XTMP(PSUARSUB,"DIV_CAT",PSUDIV,PSUAMCAT,"DISP")=X+PSUDISP
 | 
|---|
| 72 |  . S X=$G(^XTMP(PSUARSUB,"DIV_CAT",PSUDIV,PSUAMCAT,"COST"))
 | 
|---|
| 73 |  . S ^XTMP(PSUARSUB,"DIV_CAT",PSUDIV,PSUAMCAT,"COST")=X+PSUCOST
 | 
|---|
| 74 |  . M ^XTMP("PSUTCST",PSUDIV,PSUAMCAT)=^XTMP(PSUARSUB,"DIV_CAT",PSUDIV,PSUAMCAT,"COST")
 | 
|---|
| 75 |  ;
 | 
|---|
| 76 |  Q
 | 
|---|
| 77 |  ;
 | 
|---|
| 78 | DRUG ;  Process one drug for one site for one day
 | 
|---|
| 79 |  ;  Load & loop categories within Drug
 | 
|---|
| 80 |  ;  total dispense & returns
 | 
|---|
| 81 |  ;  Category multiple loaded into PSUCAT
 | 
|---|
| 82 |  ;
 | 
|---|
| 83 |  S PSUDRIEN=$$VALI^PSUTL(58.52,"PSUDTDA,PSUSDA,PSUDRDA",.01)
 | 
|---|
| 84 |  K PSUCAT
 | 
|---|
| 85 |  D GETM^PSUTL(58.52,"PSUDTDA,PSUSDA,PSUDRDA","1*^.01;1","PSUCAT","I")
 | 
|---|
| 86 |  ;
 | 
|---|
| 87 |  S PSUCDA=0,PSUDISP=0,PSUTR=0
 | 
|---|
| 88 |  F  S PSUCDA=$O(PSUCAT(PSUCDA)) Q:PSUCDA'>0  Q:$G(PSUQUIT)  D
 | 
|---|
| 89 |  . S X=PSUCAT(PSUCDA,.01,"I")
 | 
|---|
| 90 |  . S Y=PSUCAT(PSUCDA,1,"I")
 | 
|---|
| 91 |  . I (X="A")!(X="W") S PSUDISP=PSUDISP+Y,PSUTDS=PSUDISP
 | 
|---|
| 92 |  . I (X="RA")!(X="RW") S PSUDISP=PSUDISP-Y,PSUTR=PSUTR+Y
 | 
|---|
| 93 |  ;  Adjust accumulative dispenses
 | 
|---|
| 94 |  ;
 | 
|---|
| 95 |  S X=$G(^XTMP(PSUARSUB,"DIV_DRUG",PSUDIV,PSUDRIEN))
 | 
|---|
| 96 |  S ^XTMP(PSUARSUB,"DIV_DRUG",PSUDIV,PSUDRIEN)=X+PSUDISP
 | 
|---|
| 97 |  ;
 | 
|---|
| 98 |  N PSUT
 | 
|---|
| 99 |  S PSUT=$G(PSUTDSP(PSUDIV,PSUDRIEN))
 | 
|---|
| 100 |  I $D(PSUTDS) D
 | 
|---|
| 101 |  .S PSUTDSP(PSUDIV,PSUDRIEN)=PSUTDS+PSUT    ;Total Quantity dispensed
 | 
|---|
| 102 |  .I (PSUTDS+PSUT)=0 S PSUTDSP(PSUDIV,PSUDRIEN)=""
 | 
|---|
| 103 |  ;
 | 
|---|
| 104 |  N PSUT1
 | 
|---|
| 105 |  S PSUT1=$G(PSUTRET(PSUDIV,PSUDRIEN))
 | 
|---|
| 106 |  I $D(PSUTR) D
 | 
|---|
| 107 |  .S PSUTRET(PSUDIV,PSUDRIEN)=PSUTR+PSUT1    ;Total Quantity returned
 | 
|---|
| 108 |  .I (PSUTR+PSUT1)=0 S PSUTRET(PSUDIV,PSUDRIEN)=""
 | 
|---|
| 109 |  K PSUCAT
 | 
|---|
| 110 |  Q
 | 
|---|
| 111 | DIV(PSUSDA,PSUDTDA) ;EP process for a site the associated divisions by date.
 | 
|---|
| 112 |  ; uses PSUSDA as entry for site ien in file 59.4 : returns division
 | 
|---|
| 113 |  ; as of 2/99 date is no longer used as a parameter
 | 
|---|
| 114 |  N PSUDIV,PSUDT
 | 
|---|
| 115 |  I '$D(^XTMP(PSUARSUB,"DIVLK",PSUSDA)) D AOU
 | 
|---|
| 116 |  ; ^XTMP(PSUARSUB,"DIVlk",Site IEN, AOU Inactive Date -1)=Division IEN
 | 
|---|
| 117 |  ;
 | 
|---|
| 118 |  ; if AOU did not set division then return null 
 | 
|---|
| 119 |  I '$D(^XTMP(PSUARSUB,"DIVLK",PSUSDA)) S PSUDIV="NULL" Q PSUDIV
 | 
|---|
| 120 |  ;
 | 
|---|
| 121 |  S PSUDIV=$O(^XTMP(PSUARSUB,"DIVLK",PSUSDA,""))
 | 
|---|
| 122 |  Q PSUDIV
 | 
|---|
| 123 |  ;
 | 
|---|
| 124 | AOU ;EP map divisions by dates for  inpatient sites from the AOU file
 | 
|---|
| 125 |  ;PSUADA - ien for AOU Stock file
 | 
|---|
| 126 |  ;
 | 
|---|
| 127 |  N PSUADA,PSUDIV,PSUINACT,PSUDIV,PSUSLOC,MAPLOCI
 | 
|---|
| 128 |  ;
 | 
|---|
| 129 |  D GETM^PSUTL(59.7,1,"90.01*^.01;.02;.03","MAPLOCI","I")
 | 
|---|
| 130 |  ;set array MAPLOCI(ien,fld)=internal value
 | 
|---|
| 131 |  ;field .02 points to 40.8 Medical Center Division where fac num is #1
 | 
|---|
| 132 |  ;field .03 points to 59 Outpatient site where site num is #.06
 | 
|---|
| 133 |  D MOVEMI^PSUTL("MAPLOCI")
 | 
|---|
| 134 |  ;
 | 
|---|
| 135 |  K ^XTMP(PSUARSUB,"DIVLK")
 | 
|---|
| 136 |  ;
 | 
|---|
| 137 |  S PSUADA=0
 | 
|---|
| 138 |  F  S PSUADA=$O(^PSI(58.1,"ASITE",PSUSDA,PSUADA)) Q:PSUADA'>0  D
 | 
|---|
| 139 |  . N PSUDIV S PSUDIV=""
 | 
|---|
| 140 |  . S PSUSLOC=$$VALI^PSUTL(59.4,PSUSDA,.01)
 | 
|---|
| 141 |  . S PSUINACT=$$VALI^PSUTL(58.1,PSUADA,3)
 | 
|---|
| 142 |  . I PSUINACT Q  ; inactivated sites are to be ignored regardles of date
 | 
|---|
| 143 |  . S:'PSUINACT PSUINACT=DT+1
 | 
|---|
| 144 |  . I '$G(MAPLOCI(PSUADA,.01)) S PSUDIV="NULL"
 | 
|---|
| 145 |  . I $G(MAPLOCI(PSUADA,.01)) D
 | 
|---|
| 146 |  .. S X=$G(MAPLOCI(PSUADA,.02)) I X S PSUDIV=$$VALI^PSUTL(40.8,X,1)
 | 
|---|
| 147 |  .. S X=$G(MAPLOCI(PSUADA,.03)) I X S PSUDIV=$$VALI^PSUTL(59,X,.06)
 | 
|---|
| 148 |  .. S ^XTMP(PSUARSUB,"DIVLK",PSUSDA,PSUDIV)=""
 | 
|---|
| 149 |  ;
 | 
|---|
| 150 |  Q
 | 
|---|
| 151 |  ;
 | 
|---|
| 152 | MAP ;Find out whether an Area of Use (AOU) is mapped to a division or
 | 
|---|
| 153 |  ;outpatient site.  If it is not mapped, store the NAME and INACTIVATION
 | 
|---|
| 154 |  ;DATE (if applicable) in a global to be mailed to the user.
 | 
|---|
| 155 |  ;
 | 
|---|
| 156 |  S PSUNAM=0                         ;This is the name of the Area of USE
 | 
|---|
| 157 |  ;
 | 
|---|
| 158 |  F  S PSUNAM=$O(^PSI(58.1,"B",PSUNAM)) Q:PSUNAM=""  D
 | 
|---|
| 159 |  .S IEN=0                        ;This is the IEN for file 58.1
 | 
|---|
| 160 |  .F  S IEN=$O(^PSI(58.1,"B",PSUNAM,IEN)) Q:IEN=""  D
 | 
|---|
| 161 |  ..K AOU
 | 
|---|
| 162 |  ..D GETS^PSUTL(58.1,IEN,".01;3","AOU(IEN)")  ;Name & Inactive Date
 | 
|---|
| 163 |  ..D MAP1
 | 
|---|
| 164 |  Q
 | 
|---|
| 165 |  ;
 | 
|---|
| 166 | MAP1 ;MAP continued. This subroutine takes the IEN from file 58.1 and looks
 | 
|---|
| 167 |  ;to see if it is in file 59.7, field 90.01.  If it is, then it has
 | 
|---|
| 168 |  ;been mapped if there is a value in subfield .02 or .03.
 | 
|---|
| 169 |  ;If there is no value in subfield .02 or .03 it has not been mapped
 | 
|---|
| 170 |  ;
 | 
|---|
| 171 |  ;Keep only the entries that are NOT mapped
 | 
|---|
| 172 |  ;
 | 
|---|
| 173 |  N PSUDA
 | 
|---|
| 174 |  ;
 | 
|---|
| 175 |  I $G(^PS(59.7,1,90.01,IEN,0)) D
 | 
|---|
| 176 |  .D GETM^PSUTL(59.7,1,"90.01*^.01;.02;.03","MAPLOCI")
 | 
|---|
| 177 |  .S PSUDA=0
 | 
|---|
| 178 |  .F  S PSUDA=$O(MAPLOCI(PSUDA)) Q:PSUDA=""  D
 | 
|---|
| 179 |  ..I MAPLOCI(PSUDA,.02)'="" K AOU(PSUDA)
 | 
|---|
| 180 |  ..I $G(MAPLOCI(PSUDA,.03))'="" K AOU(PSUDA)
 | 
|---|
| 181 |  M ^XTMP(PSUARSUB,"AOU")=AOU          ;Contains only unmapped locations
 | 
|---|
| 182 |  Q
 | 
|---|
| 183 |  ;
 | 
|---|
| 184 | CLEAR ;EP Clear ^XTMP("PSUAR*")
 | 
|---|
| 185 |  S X="PSUAR",Y=X
 | 
|---|
| 186 |  F  S Y=$O(^XTMP(Y)) Q:($E(Y,1,5)'=X)  W !,Y K ^XTMP(Y)
 | 
|---|
| 187 |  Q
 | 
|---|