1 | PSUCP ;BIR/TJH,PDW - PBM CONTROL POINT ; 06/08/07
|
---|
2 | ;;4.0;PHARMACY BENEFITS MANAGEMENT;**12**;MARCH, 2005;Build 19
|
---|
3 | ; Reference to File #4 supported by DBIA 10090
|
---|
4 | ; Reference to File #4.3 supported by DBIA 10091
|
---|
5 | ; Reference to File #40.8 supported by DBIA 2438
|
---|
6 | ; Reference to File #59.7 supported by DBIA 2854
|
---|
7 | ; move CLEANUP^PSUHL from PSURT1, delete calls to PSUCP3 (PSU*4*12)
|
---|
8 | MANUAL ; entry point for manual option
|
---|
9 | S PSUALERT=0 D MANUAL^PSUALERT
|
---|
10 | I PSUALERT K PSUALERT Q
|
---|
11 | K PSUALERT
|
---|
12 | S PSUFQ=1
|
---|
13 | I $D(^XTMP("PSUJFLG")) D Q:Y=0 Q:Y="^"
|
---|
14 | .W !!,"NOTE: A PREVIOUS JOB HAS NOT COMPLETED DUE TO AN ERROR"
|
---|
15 | .W !!,"PLEASE ALERT YOUR IRM."
|
---|
16 | .W !!,"RESPOND 'YES' TO CONTINUE, OR 'NO' TO EXIT"
|
---|
17 | .S DIR(0)="Y",DIR("B")="NO"
|
---|
18 | .S DIR("A")="Do you wish to continue"
|
---|
19 | .D ^DIR
|
---|
20 | D CLEANUP^PSUHL
|
---|
21 | S PSUJOB=$J_"_"_$P($H,",",2)
|
---|
22 | S ^XTMP("PSUMANL")=""
|
---|
23 | D EN^PSUCP1 ; prompt for report choices
|
---|
24 | I PSUERR G EXIT
|
---|
25 | D XMY^PSUTL1 ; Setup for mail groups according to choices
|
---|
26 | S ^XTMP("PSUJFLG")="",PSUAUTO=0,^XTMP("PSU_"_PSUJOB,"PSUJOB")=PSUJOB
|
---|
27 | D PUT
|
---|
28 | S PSUTITLE="PSU PBM MANUAL",PSURC="RUN^PSUCP"
|
---|
29 | S PSURP=$S('$L(PSUIOP):"",1:"PRINT^PSUCP")
|
---|
30 | S PSURX="EXIT^PSUCP",PSUNS="PS"
|
---|
31 | S ^XTMP("PSU","RUNNING")=$G(ZTSK)
|
---|
32 | K PSUALERT,XAQ,SQAFLG,SQAID,XQAMSG,XQMSG,ZTSK
|
---|
33 | D ^PSUDBQUE
|
---|
34 | MANUALQ Q
|
---|
35 | ;
|
---|
36 | AUTO ; set variables for Auto-report option and task to background
|
---|
37 | S PSUALERT=0 D AUTO^PSUALERT
|
---|
38 | I PSUALERT K PSUALERT Q
|
---|
39 | I $D(^XTMP("PSU","RUNNING")) D Q
|
---|
40 | .S XQA(DUZ)="",XQA("G.PSU PBM")="",XQMSG="An ERROR has occurred. Please contact IRM for assistance."
|
---|
41 | .S XQAID="PSU",XQAFLG="D" D SETUP^XQALERT
|
---|
42 | D CLEANUP^PSUHL
|
---|
43 | S PSUJOB=$J_"_"_$P($H,",",2)
|
---|
44 | S ^XTMP("PSU_"_PSUJOB,"PSUFLAG1")="" ;flag for mail patient summary reports
|
---|
45 | S ^XTMP("PSU_"_PSUJOB,"PSUPSUMFLAG")=1 ;Set 'auto' flag
|
---|
46 | S ^XTMP("PSUJFLG")="" ;FLAG to avoid concurrent jobs running
|
---|
47 | D ; schedule job completion check
|
---|
48 | .S PSURC="AUTO^PSUCP2",PSUTITLE="PSU PBM JOB CHECK",PSUFQ=1
|
---|
49 | .S (PSURP,PSURX,PSUIOP)=""
|
---|
50 | .D NOW^%DTC S X1=%,X2=6 D C^%DTC S PSUDTH=X ; LIVE MODE, wait 6 days (72 hours)
|
---|
51 | .D ^PSUDBQUE
|
---|
52 | .S ^XTMP("PSU","RUNNING")=$G(ZTSK)
|
---|
53 | D NOW^%DTC S PSUMON=$S('$D(DT):X,1:DT),PSUMON=$E(PSUMON,1,5)-1 ; get previous month
|
---|
54 | I $E(PSUMON,4,5)="00" S PSUMON=($E(PSUMON,1,3)-1)_"12" ; set to Dec. of previous year if this month is Jan.
|
---|
55 | S ^XTMP("PSU_"_PSUJOB,"PSUMONTH")=PSUMON,PSUSDT=PSUMON_"01"
|
---|
56 | S PSULY=$$LEAPYR(PSUMON),X=U_$E(PSUMON,4,5)_U
|
---|
57 | S PSUEDT=PSUMON_$S(X["02":$S(PSULY:"29",1:"28"),"^04^06^09^11^"[X:"30",1:"31")
|
---|
58 | S PSUDUZ=$S(DUZ=0:.5,1:DUZ),PSUMASF=1,PSUSMRY=0,PSUPBMG=1
|
---|
59 | S ^XTMP("PSU_"_PSUJOB,"PSUPDFLAG")=1 ;Flag-detailed PD won't go to user auto extract
|
---|
60 | S X=$$VALI^PSUTL(4.3,1,217),PSUSNDR=+$$VAL^PSUTL(4,X,99)
|
---|
61 | S PSUOPTS="1,2,3,4,5,6,7,8,9,10,11,12,13",PSUAUTO=1,PSUIOP="" D
|
---|
62 | .S ^XTMP("PSU_"_PSUJOB,"CBAMIS")=""
|
---|
63 | S ^XTMP("PSU_"_PSUJOB,"PSUJOB")=PSUJOB
|
---|
64 | D PUT
|
---|
65 | S PSUTITLE="PSU PBM AUTO",PSURC="RUN^PSUCP",PSURX="EXIT^PSUCP",PSURP="",PSUNS="PS",PSUFQ=1
|
---|
66 | D NOW^%DTC S PSUDTH=%
|
---|
67 | D ^PSUDBQUE
|
---|
68 | K PSUALERT,XQA,XQAID,XQAFLG,XQA,ZTSK
|
---|
69 | AUTOQ Q ; exit from AUTO
|
---|
70 | ;
|
---|
71 | RUN ; run each selected module
|
---|
72 | L ^XTMP("PSU","RUNNING"):1 I '$T Q
|
---|
73 | D PULL,OPTS
|
---|
74 | K PSUMOD,PSUFDA
|
---|
75 | I PSUAUTO S PSUFDA(59.7,"1,",90)="@" D FILE^DIE("","PSUFDA","")
|
---|
76 | F I=1:1:$L(PSUOPTS,",") S PSUMOD($P(PSUOPTS,",",I))=""
|
---|
77 | S PSUOPTN=""
|
---|
78 | F S PSUOPTN=$O(PSUMOD(PSUOPTN)) Q:PSUOPTN="" D
|
---|
79 | .K PSUMSGT
|
---|
80 | .D PULL
|
---|
81 | .I PSUAUTO S PSUPBMG=1
|
---|
82 | .D XMY^PSUTL1
|
---|
83 | .S PSURTN=PSUA(PSUOPTN,"R")
|
---|
84 | .D NOW^%DTC
|
---|
85 | .S ^XTMP("PSU_"_PSUJOB,"STATUS",PSUOPTN,"START")=%
|
---|
86 | .D @PSURTN,PULL,NOW^%DTC
|
---|
87 | .S ^XTMP("PSU_"_PSUJOB,"STATUS",PSUOPTN,"STOP")=%
|
---|
88 | D DT^DILF("E",PSUSDT,.EXTD)
|
---|
89 | S PSURP("START")=EXTD(0)
|
---|
90 | D DT^DILF("E",PSUEDT,.EXTD)
|
---|
91 | S PSURP("END")=EXTD(0),PSUSUB="PSU_"_PSUJOB
|
---|
92 | D MMNOMAP^PSUCP2 ; MM send regarding PBM locations not mapped
|
---|
93 | D TIMING ; send a report of how long each module took to complete
|
---|
94 | I PSUMASF!PSUPBMG D CONFIRM ;Confirmation message sent only if data went to Master File
|
---|
95 | I PSUAUTO D
|
---|
96 | .D NOW^%DTC
|
---|
97 | .S PSUFDA(59.7,"1,",90)=% K %,%H,%I,X
|
---|
98 | .D FILE^DIE("","PSUFDA","") ; file the completion date in 59.7,90;1
|
---|
99 | L
|
---|
100 | ;
|
---|
101 | Q
|
---|
102 | PRINT ; print hard copy if requested
|
---|
103 | Q:'$L(PSUIOP) ; no printer selected, stop right here.
|
---|
104 | D PULL,OPTS
|
---|
105 | K PSUMOD
|
---|
106 | F I=1:1:$L(PSUOPTS,",") S PSUMOD($P(PSUOPTS,",",I))=""
|
---|
107 | S PSUOPTN=""
|
---|
108 | F S PSUOPTN=$O(PSUMOD(PSUOPTN)) Q:PSUOPTN="" D
|
---|
109 | .D PULL
|
---|
110 | .S PSURTN=PSUA(PSUOPTN,"P")
|
---|
111 | .D @PSURTN
|
---|
112 | L
|
---|
113 | K ^XTMP("PSU","RUNNING")
|
---|
114 | PRINTQ Q
|
---|
115 | EXIT ; exit point
|
---|
116 | K ^XTMP("PSU","RUNNING")
|
---|
117 | K ^XTMP("PSUJFLG") ;Remove flag to prevent concurrent jobs
|
---|
118 | Q
|
---|
119 | PUT ; put variables in ^XTMP so modules can retrieve them
|
---|
120 | S PSUVARS="PSUSDT,PSUEDT,PSUMON,PSUDUZ,PSUMASF,PSUPBMG,PSUSMRY,PSUIOP,PSUSNDR,PSUOPTS,PSUAUTO"
|
---|
121 | S PSUVSTR=""
|
---|
122 | F I=1:1:$L(PSUVARS,",") S $P(PSUVSTR,U,I)=@$P(PSUVARS,",",I)
|
---|
123 | S X1=DT,X2=6 D C^%DTC
|
---|
124 | S ^XTMP("PSU_"_PSUJOB,0)=X_U_DT_U_"Control data for PSU PBM individual modules"
|
---|
125 | S ^XTMP("PSU_"_PSUJOB,1)=PSUVSTR
|
---|
126 | K PSUVARS,PSUVSTR,X,X1
|
---|
127 | PUTQ Q
|
---|
128 | PULL ; pull variables from ^XTMP
|
---|
129 | ; PSUJOB must exist and must be the job number used to store the data desired for this session.
|
---|
130 | N I
|
---|
131 | S PSUVARS="PSUSDT,PSUEDT,PSUMON,PSUDUZ,PSUMASF,PSUPBMG,PSUSMRY,PSUIOP,PSUSNDR,PSUOPTS,PSUAUTO"
|
---|
132 | F I=1:1:$L(PSUVARS,",") S @$P(PSUVARS,",",I)=$P($G(^XTMP("PSU_"_PSUJOB,1)),U,I)
|
---|
133 | PULLQ Q
|
---|
134 | ;
|
---|
135 | OPTS ; set option array
|
---|
136 | S PSUA(1,"M")="IVs",PSUA(1,"R")="EN^PSUV0",PSUA(1,"P")="PRINT^PSUV0",PSUA(1,"C")="IV"
|
---|
137 | S PSUA(2,"M")="Unit Dose",PSUA(2,"R")="EN^PSUUD0",PSUA(2,"P")="PRINT^PSUUD0",PSUA(2,"C")="UD"
|
---|
138 | S PSUA(3,"M")="AR/WS",PSUA(3,"R")="EN^PSUAR0",PSUA(3,"P")="PRINT^PSUAR0",PSUA(3,"C")="AR"
|
---|
139 | S PSUA(4,"M")="Prescription",PSUA(4,"R")="EN^PSUOP0",PSUA(4,"P")="PRINT^PSUOP0",PSUA(4,"C")="OP"
|
---|
140 | S PSUA(5,"M")="Procurement",PSUA(5,"R")="EN^PSUPR0",PSUA(5,"P")="PRINT^PSUPR0",PSUA(5,"C")="PR"
|
---|
141 | S PSUA(6,"M")="Controlled Substances",PSUA(6,"R")="EN^PSUCS0",PSUA(6,"P")="PRINT^PSUCS0",PSUA(6,"C")="CS"
|
---|
142 | S PSUA(7,"M")="Patient Demographics",PSUA(7,"R")="EN^PSUDEM1",PSUA(7,"P")="PRINT^PSUDEM0",PSUA(7,"C")="PD"
|
---|
143 | S PSUA(8,"M")="Outpatient Visits",PSUA(8,"R")="EN^PSUDEM2",PSUA(8,"P")="OPV^PSUDEM0",PSUA(8,"C")="OV"
|
---|
144 | S PSUA(9,"M")="Inpatient PTF Records",PSUA(9,"R")="EN^PSUDEM7",PSUA(9,"P")="PTF^PSUDEM0",PSUA(9,"C")="PTF"
|
---|
145 | S PSUA(10,"M")="Provider Data",PSUA(10,"R")="EN^PSUDEM4",PSUA(10,"P")="PRO^PSUDEM0",PSUA(10,"C")="PRO"
|
---|
146 | S PSUA(11,"M")="Allergies/Adverse Events",PSUA(11,"R")="EN^PSUAA1",PSUA(11,"P")="PRINT^PSUAA1",PSUA(11,"C")="AA"
|
---|
147 | S PSUA(12,"M")="Vitals/Immunizations Information",PSUA(12,"R")="EN^PSUVIT1",PSUA(12,"P")="EN^PSUVIT0",PSUA(12,"C")="VI"
|
---|
148 | S PSUA(13,"M")="Laboratory Results",PSUA(13,"R")="EN^PSULR0",PSUA(13,"P")="PRINT^PSULR0",PSUA(13,"C")="LR"
|
---|
149 | S PSUA("A")=""
|
---|
150 | OPTSQ Q
|
---|
151 | ;
|
---|
152 | CONFIRM ;Send confirmation by Division(s)
|
---|
153 | K PSUCONF
|
---|
154 | S PSUDIV=0,$P(PSUDASH,"-",81)=""
|
---|
155 | D OPTS
|
---|
156 | S PSUCONF(1)="The chart below shows the package(s) whose dispensing statistics were extracted"
|
---|
157 | S PSUCONF(2)="by the PBM "_$S($G(PSUAUTO):"Automatic",$G(PSURXMT):"RETRANSMISSION",1:"Manual")_" Pharmacy Statistics option."
|
---|
158 | ; S PSUCONF(2)="by the PBM "_$S(PSUAUTO:"Automatic",1:"Manual")_" Pharmacy Statistics option."
|
---|
159 | S PSUCONF(3)=" "
|
---|
160 | S PSUCONF(4)="PACKAGE"_$J("# Line items",35)_$J("# MailMan msgs",19)
|
---|
161 | S PSUCONF(5)=$E(PSUDASH,1,79)
|
---|
162 | F S PSUDIV=$O(^XTMP(PSUSUB,"CONFIRM",PSUDIV)) Q:PSUDIV'?1N.E D
|
---|
163 | .K ^XTMP(PSUSUB,"XMD")
|
---|
164 | .M ^XTMP(PSUSUB,"XMD")=PSUCONF
|
---|
165 | .S PSUOPT=0,PSULCT=5
|
---|
166 | .F S PSUOPT=$O(^XTMP(PSUSUB,"CONFIRM",PSUDIV,PSUOPT)) Q:PSUOPT'?1.N D
|
---|
167 | ..S PSULCT=PSULCT+1
|
---|
168 | ..S PSUPKG=PSUA(PSUOPT,"M")
|
---|
169 | ..S PSULIN=^XTMP(PSUSUB,"CONFIRM",PSUDIV,PSUOPT,"L")
|
---|
170 | ..S PSUMSG=^XTMP(PSUSUB,"CONFIRM",PSUDIV,PSUOPT,"M")
|
---|
171 | ..S ^XTMP(PSUSUB,"XMD",PSULCT)=PSUPKG_$J(PSULIN,37-$L(PSUPKG))_$J(PSUMSG,12)
|
---|
172 | ..Q:PSUPKG'="Prescription" ;*
|
---|
173 | .. ; process Prescription MultiDose
|
---|
174 | ..S PSULCT=PSULCT+1
|
---|
175 | ..S PSUPKG="Prescription MultiDose"
|
---|
176 | ..S PSULIN=+$G(^XTMP(PSUSUB,"CONFIRMD",PSUDIV,PSUOPT,"L"))
|
---|
177 | ..S PSUMSG=+$G(^XTMP(PSUSUB,"CONFIRMD",PSUDIV,PSUOPT,"M"))
|
---|
178 | ..S ^XTMP(PSUSUB,"XMD",PSULCT)=PSUPKG_$J(PSULIN,37-$L(PSUPKG))_$J(PSUMSG,12) ;*
|
---|
179 | .S PSUSUBJ="PBM Stats for "
|
---|
180 | .I $G(PSUMASF)!$G(PSUDUZ)!$G(PSUPBMG) D XMD
|
---|
181 | CONFIRMQ Q
|
---|
182 | ;
|
---|
183 | XMD ;Email
|
---|
184 | ;
|
---|
185 | S XMDUZ=DUZ
|
---|
186 | D XMY^PSUTL1
|
---|
187 | M XMY=PSUXMYS1
|
---|
188 | I $G(PSUMASF)!$G(PSUPBMG) M XMY=PSUXMYH
|
---|
189 | S X=PSUDIV,DIC=40.8,DIC(0)="XM" D ^DIC
|
---|
190 | S X=+Y S PSUDIVNM=$$VAL^PSUTL(40.8,X,.01)
|
---|
191 | S XMSUB=PSUSUBJ_PSURP("START")_" to "_PSURP("END")_" from "_PSUDIV_" "_PSUDIVNM
|
---|
192 | S XMTEXT="^XTMP(PSUSUB,""XMD"","
|
---|
193 | S XMCHAN=1
|
---|
194 | D ^XMD
|
---|
195 | XMDQ Q
|
---|
196 | ;
|
---|
197 | TIMING ; Timing report
|
---|
198 | K ^XTMP(PSUSUB,"XMD")
|
---|
199 | S $P(PSUSPACE," ",41)=""
|
---|
200 | S PSUX=0,PSULCT=0
|
---|
201 | F S PSUX=$O(^XTMP(PSUSUB,"STATUS",PSUX)) Q:PSUX="" D
|
---|
202 | .S (X,Y)=^XTMP(PSUSUB,"STATUS",PSUX,"START") X ^DD("DD") D
|
---|
203 | ..I $E(Y,17)=":" S PSUT1=$E(Y,1,16)
|
---|
204 | ..I $E(Y,17)'=":" S PSUT1=$E(Y,1,17)
|
---|
205 | .S (X1,Y)=^XTMP(PSUSUB,"STATUS",PSUX,"STOP") X ^DD("DD") D
|
---|
206 | ..I $E(Y,17)=":" S PSUT2=$E(Y,1,16)
|
---|
207 | ..I $E(Y,17)'=":" S PSUT2=$E(Y,1,17)
|
---|
208 | .S Y=$E(X1_"000",9,10)-$E(X_"000",9,10)*60+$E(X1_"00000",11,12)-$E(X_"00000",11,12),X2=X,X=$P(X,".",1)'=$P(X1,".",1)
|
---|
209 | .D ^%DTC:X S X=X*1440+Y
|
---|
210 | .S PSULCT=PSULCT+1
|
---|
211 | .S PSUREC=$E(PSUA(PSUX,"M")_PSUSPACE,1,20)_$J(PSUT1,20)_$J(PSUT2,20)_$J(X\60,4)_" hrs,"_$J(X#60,3)_" min"
|
---|
212 | .S ^XTMP(PSUSUB,"XMD",PSULCT)=PSUREC
|
---|
213 | S PSULCT=PSULCT+1
|
---|
214 | S $P(^XTMP(PSUSUB,"XMD",PSULCT),"-",80)="" S PSULCT=PSULCT+1
|
---|
215 | S ^XTMP(PSUSUB,"XMD",PSULCT)="" S PSULCT=PSULCT+1
|
---|
216 | S ^XTMP(PSUSUB,"XMD",PSULCT)="**NOTE: Timing for the Provider Data extract is not recorded when" S PSULCT=PSULCT+1
|
---|
217 | S ^XTMP(PSUSUB,"XMD",PSULCT)=" the IV, Unit Dose, Prescription, and Patient Demographics extracts" S PSULCT=PSULCT+1
|
---|
218 | S ^XTMP(PSUSUB,"XMD",PSULCT)=" are run concurrently."
|
---|
219 | S PSUDIV=PSUSNDR
|
---|
220 | S PSUSUBJ="PBM TIMING for report "
|
---|
221 | D XMD
|
---|
222 | TIMINGQ Q
|
---|
223 | ;
|
---|
224 | LEAPYR(FMYR) ; Check to see if year is a leap year: 1=leap year, 0=not leap year
|
---|
225 | N YYYY
|
---|
226 | S YYYY=1700+$E(FMYR,1,3)
|
---|
227 | Q (((YYYY#4=0)&(YYYY#100'=0))!((YYYY#100=0)&(YYYY#400=0)))
|
---|