| 1 | PSUUD1 ;BIR/TJH - PBM UNIT DOSE MODULE ;12 AUG 1999
 | 
|---|
| 2 |  ;;4.0;PHARMACY BENEFITS MANAGEMENT;;MARCH, 2005
 | 
|---|
| 3 |  ;DBIA(s)
 | 
|---|
| 4 |  ; Reference to file #55  supported by DBIA 2497
 | 
|---|
| 5 |  ; Reference to file #7   supported by DBIA 2495
 | 
|---|
| 6 |  ; Reference to file #50  supported by DBIA 221
 | 
|---|
| 7 |  ; Reference to file #42  supported by DBIA 2440
 | 
|---|
| 8 |  ; Reference to file #40.8 supported by DBIA 2438
 | 
|---|
| 9 |  ; Reference to file #200  supported by DBIA 10060
 | 
|---|
| 10 |  ; Reference to XUA4A72    supported by DBIA 1625
 | 
|---|
| 11 |  ;
 | 
|---|
| 12 | EN ; Entry point
 | 
|---|
| 13 |  ;
 | 
|---|
| 14 |  N PSUDOC1,PSUUDST
 | 
|---|
| 15 |  D SETUP^PSUUD2 ; set up various arrays, variables needed for processing
 | 
|---|
| 16 |  ;
 | 
|---|
| 17 |  ; loop thru AUD 'stop date' index
 | 
|---|
| 18 |  ; *34 |==>
 | 
|---|
| 19 |  S PSDATE=PSUSDT\1-.0001 ;use 1st date of scan for 'stop date'
 | 
|---|
| 20 | L1 S PSDATE=$O(^PS(55,"AUD",PSDATE))
 | 
|---|
| 21 |  I (PSDATE="") G STEP2
 | 
|---|
| 22 |  S PSPAT=0,PSUTEDT=PSUEDT\1+.2359
 | 
|---|
| 23 | L2 ; loop thru patient within date
 | 
|---|
| 24 |  S PSPAT=$O(^PS(55,"AUD",PSDATE,PSPAT))
 | 
|---|
| 25 |  ; <==| *34
 | 
|---|
| 26 |  G:PSPAT'?1.N L1
 | 
|---|
| 27 |  ; SCREEN OUT TEST PATIENTS
 | 
|---|
| 28 |  G:$$TESTPAT^PSUTL1(PSPAT) L2
 | 
|---|
| 29 |  S PSDOSE=0
 | 
|---|
| 30 | L3 ; loop thru unit dose entries within patient
 | 
|---|
| 31 |  S PSDOSE=$O(^PS(55,"AUD",PSDATE,PSPAT,PSDOSE))
 | 
|---|
| 32 |  G:PSDOSE'?1.N L2
 | 
|---|
| 33 |  I '$D(^PS(55,PSPAT,5,PSDOSE,11)) G L3 ;*34
 | 
|---|
| 34 |  S ^XTMP("PSU_"_PSUJOB,"PSUHLD",PSDOSE)=""
 | 
|---|
| 35 |  K PSUDOSE
 | 
|---|
| 36 |  S XX=$$VALI^PSUTL(55.06,"PSPAT,PSDOSE",10) ;*34
 | 
|---|
| 37 |  I (XX\1)>PSUTEDT G L3  ;*34
 | 
|---|
| 38 |  ;
 | 
|---|
| 39 |  D GETS^PSUTL(55.06,"PSPAT,PSDOSE",".01;.5;1;9;10;26;34;68","PSUDOSE","I")
 | 
|---|
| 40 |  D MOVEI^PSUTL("PSUDOSE")
 | 
|---|
| 41 |  ;.01=order number, .5=patient ptr, 1=provider ptr, 9=original ward
 | 
|---|
| 42 |  ;10=start date/time, 26=schedule, 34=stop date/time, 68=last ward
 | 
|---|
| 43 |  S PSUUDST=PSUDOSE(34)\1
 | 
|---|
| 44 |  S PSUDOSE(10)=$P(PSUDOSE(10),".",1)
 | 
|---|
| 45 |  S DFN=PSUDOSE(.5) D PID^VADPT
 | 
|---|
| 46 |  S PSUSSN=$TR(VA("PID"),"^-","'")
 | 
|---|
| 47 |  I $G(PSUSSN) S ^XTMP("PSU_"_PSUJOB,"PSUTDFN",DFN,PSUSSN)=""
 | 
|---|
| 48 |  S PSUFACN=PSUSNDR,PSUX=$S($L(PSUDOSE(9)):PSUDOSE(9),1:PSUDOSE(68))
 | 
|---|
| 49 |  I $L(PSUX) D
 | 
|---|
| 50 |  .S PSUX1=$$VALI^PSUTL(42,PSUX,.015)
 | 
|---|
| 51 |  .I PSUX1'="" S PSUFACN=$$VALI^PSUTL(40.8,PSUX1,1)
 | 
|---|
| 52 | PROV ; collect provider data
 | 
|---|
| 53 |  S (PSUVCL,PSUVS1,PSUVS2)=""
 | 
|---|
| 54 |  S PSUVSSN=$$VALI^PSUTL(200,PSUDOSE(1),9)
 | 
|---|
| 55 |  I PSUVSSN="" S PSUVSSN=999999999
 | 
|---|
| 56 |  S ^XTMP("PSU_"_PSUJOB,"PSUPDR",PSUVSSN,PSUDOSE(1))=""
 | 
|---|
| 57 |  S PSUDOC(9)=PSUVSSN
 | 
|---|
| 58 |  ;
 | 
|---|
| 59 |  S PSUVCP=$$VALI^PSUTL(200,PSUDOSE(1),53.5) ; class pointer
 | 
|---|
| 60 |  I PSUVCP'="" D
 | 
|---|
| 61 |  .S PSUVCL=$$VALI^PSUTL(7,PSUVCP,1)
 | 
|---|
| 62 |  .I PSUVCL="" S PSUVCL=$$VALI^PSUTL(7,PSUVCP,.01)
 | 
|---|
| 63 |  S PSUVSV=$$VAL^PSUTL(200,PSUDOSE(1),29) ; points to # 49,.01
 | 
|---|
| 64 |  S PSUVSVX=$$UPPER^PSUTL(PSUVSV),PSUVSV=""
 | 
|---|
| 65 |  I $L(PSUVSVX),$D(PSECT(PSUVSVX)) S PSUVSV=PSECT(PSUVSVX) ; convert to abbrev. if found in list.
 | 
|---|
| 66 |  S PSUSPSTR=$$GET^XUA4A72(PSUDOSE(1),PSDATE)
 | 
|---|
| 67 |  S PSUVS1=$P(PSUSPSTR,U,3),PSUVS2=$P(PSUSPSTR,U,4)
 | 
|---|
| 68 |  K PSUDAS D DISAMT^PSUUD2 ; set up dispensed amount summary array PSUDAS ;*34
 | 
|---|
| 69 |  D TMPUD^PSUUD2 ; store Unit Dose info in REC1
 | 
|---|
| 70 | DISD ; Dispense Drug 55.06,2 Mult --> 55.07 ^PS(55,PAT,5,DOSE,1,DISP,0)
 | 
|---|
| 71 |  S PSUDDX=0
 | 
|---|
| 72 | DISDL1 S PSUDDX=$O(^PS(55,PSPAT,5,PSDOSE,1,PSUDDX)) G:PSUDDX'?1.N DISDX
 | 
|---|
| 73 |  ;
 | 
|---|
| 74 |  D GETS^PSUTL(55.07,"PSPAT,PSDOSE,PSUDDX",".01;.02;.03","PSUDISD","I")
 | 
|---|
| 75 |  ; .01 = drug pointer, .02 = units per dose, .03 = inactive date
 | 
|---|
| 76 |  D MOVEI^PSUTL("PSUDISD")
 | 
|---|
| 77 |  I $G(PSUDISD(.01))="" G DISDL1 ; missing data, go back and try another
 | 
|---|
| 78 |  I $L(PSUDISD(.03)),PSUDISD(.03)<PSUSDT G DISDL1
 | 
|---|
| 79 |  ;
 | 
|---|
| 80 |  ;
 | 
|---|
| 81 |  S:PSUDISD(.02)="" PSUDISD(.02)=1 ; default to 1 if not filled per Lina B.
 | 
|---|
| 82 |  D GETS^PSUTL(50,PSUDISD(.01),".01;2;14.5;16;20;21;22;25;31;51;52;3","PSUDRUG","I")
 | 
|---|
| 83 |  I '$D(PSUDRUG) F I=.01,2,14.5,16,20,21,22,25,31,51,52,3 S PSUDRUG(I,"I")=""
 | 
|---|
| 84 |  D MOVEI^PSUTL("PSUDRUG")
 | 
|---|
| 85 |  I PSUDRUG(.01)="" S PSUDRUG(.01)="Unknown Generic Name"
 | 
|---|
| 86 |  I PSUDRUG(21)="" S PSUDRUG(21)="Unknown VA Product Name"
 | 
|---|
| 87 |  I PSUDRUG(31)="" S PSUDRUG(31)="No NDC"
 | 
|---|
| 88 |  I PSUDRUG(51)=1 S PSUDRUG(51)="N/F"
 | 
|---|
| 89 |  I PSUDRUG(52) S PSUDRUG(52)="N/F"
 | 
|---|
| 90 |  S PSUDNFI="",PSUDNFR="" ; National Formulary Indicator & Restriction
 | 
|---|
| 91 |  I $$VERSION^XPDUTL("PSN")'<4 D  ; check for v.4 or greater of NDF
 | 
|---|
| 92 |  .S PSUDNFI=$$FORMI^PSNAPIS(PSUDRUG(20),PSUDRUG(22))
 | 
|---|
| 93 |  .S PSUDNFR=$$FORMR^PSNAPIS(PSUDRUG(20),PSUDRUG(22))
 | 
|---|
| 94 |  D TMPDD^PSUUD2 ; store dispense drug data in ^XTMP global
 | 
|---|
| 95 |  D LAB^PSULR0("UD",PSUFACN,PSUDOSE(.01),PSUDOSE(.5),PSUDRUG(.01),PSUDRUG(2))
 | 
|---|
| 96 |  G DISDL1
 | 
|---|
| 97 | DISDX ; end of dispense drug, go back for next one.
 | 
|---|
| 98 |  G L3
 | 
|---|
| 99 |  ;
 | 
|---|
| 100 | STEP2 ; done with data collection, go back to ^PSUUD0
 | 
|---|
| 101 |  Q
 | 
|---|