1 | PXRMMST ; SLC/PKR - Routines for dealing with MST. ;07/17/2006
|
---|
2 | ;;2.0;CLINICAL REMINDERS;**4**;Feb 04, 2005;Build 21
|
---|
3 | ;Use of DGMSTAPI supported by DBIA #2716.
|
---|
4 | ;====================================================
|
---|
5 | GSYINFO(TYPE) ;Return the Clinical Reminders MST synchronization date
|
---|
6 | ;and the number of updates made. The format is an up-arrow delimited
|
---|
7 | ;string. The first piece is the date and the second is the number
|
---|
8 | ;of updates. If TYPE is "I" then the data for the initial
|
---|
9 | ;synchronization is returned. For any other value the data for the
|
---|
10 | ;last daily synchronization is returned.
|
---|
11 | I $G(TYPE)="I" Q $P($G(^PXRM(800,1,"MST")),U,1,2) Q
|
---|
12 | Q $P($G(^PXRM(800,1,"MST")),U,3,4)
|
---|
13 | ;
|
---|
14 | ;====================================================
|
---|
15 | QUE ;Queue the MST synchronization job.
|
---|
16 | N DIR,DIROUT,DIRUT,DTOUT,DUOUT,MINDT,SDTIME,STIME,X,Y
|
---|
17 | S MINDT=$$NOW^XLFDT
|
---|
18 | W !,"Queue the Clinical Reminders MST synchronization."
|
---|
19 | S DIR("A",1)="Enter the date and time you want the job to start."
|
---|
20 | S DIR("A",2)="It must be after "_$$FMTE^XLFDT(MINDT,"5Z")
|
---|
21 | S DIR("A")="Start the task at: "
|
---|
22 | S DIR(0)="DAU"_U_MINDT_"::RSX"
|
---|
23 | D ^DIR
|
---|
24 | I $D(DIROUT)!$D(DIRUT) Q
|
---|
25 | I $D(DTOUT)!$D(DUOUT) Q
|
---|
26 | S SDTIME=Y
|
---|
27 | K DIR
|
---|
28 | S DIR(0)="YA"
|
---|
29 | S DIR("A")="Do you want to run the MST synchronization at the same time every day? "
|
---|
30 | S DIR("B")="Y"
|
---|
31 | D ^DIR
|
---|
32 | I $D(DIROUT)!$D(DIRUT) Q
|
---|
33 | I $D(DTOUT)!$D(DUOUT) Q
|
---|
34 | S STIME=$S(Y:"1."_$P(SDTIME,".",2),1:-1)
|
---|
35 | ;
|
---|
36 | ;Put the task into the queue.
|
---|
37 | K ZTSAVE
|
---|
38 | S ZTSAVE("STIME")=STIME
|
---|
39 | S ZTRTN="SYNCH^PXRMMST"
|
---|
40 | S ZTDESC="Clinical Reminders MST synchronization job"
|
---|
41 | S ZTDTH=SDTIME
|
---|
42 | S ZTIO=""
|
---|
43 | D ^%ZTLOAD
|
---|
44 | W !,"Task number ",ZTSK," queued."
|
---|
45 | Q
|
---|
46 | ;
|
---|
47 | ;====================================================
|
---|
48 | STATUS(DFN,TEST,DATE,VALUE,TEXT) ;Computed finding for checking a
|
---|
49 | ;patient's MST status.
|
---|
50 | N IEN,TEMP
|
---|
51 | S TEMP=$$GETSTAT^DGMSTAPI(DFN)
|
---|
52 | S IEN=$P(TEMP,U,1)
|
---|
53 | I IEN=-1 D Q
|
---|
54 | . S TEST=0,VALUE="",DATE=$$NOW^PXRMDATE
|
---|
55 | I IEN=0 D Q
|
---|
56 | . S TEST=0
|
---|
57 | . S VALUE=$P(TEMP,U,2)
|
---|
58 | . S DATE=$P(TEMP,U,3)
|
---|
59 | . S TEXT="No MST status found"
|
---|
60 | ;If we get to here then a valid entry was found.
|
---|
61 | S TEST=1
|
---|
62 | S VALUE=$P(TEMP,U,2)
|
---|
63 | S DATE=$P(TEMP,U,3)
|
---|
64 | Q
|
---|
65 | ;
|
---|
66 | ;====================================================
|
---|
67 | STCODE(TERM) ;Return the MST status code based on the term name.
|
---|
68 | N STCODE
|
---|
69 | S STCODE=$S(TERM="VA-MST DECLINES REPORT":"D",TERM="VA-MST NEGATIVE REPORT":"N",TERM="VA-MST POSITIVE REPORT":"Y",1:"U")
|
---|
70 | Q STCODE
|
---|
71 | ;
|
---|
72 | ;====================================================
|
---|
73 | SYNCH ;Synchronize the MST history file.
|
---|
74 | N INID,LTIME,NUMUPD,START,TEMP
|
---|
75 | ;STIME is passed from QUE via ZTSAVE.
|
---|
76 | D UPDSTAT(.NUMUPD,.START)
|
---|
77 | ;If the initial sync data has been stored then update the daily
|
---|
78 | ;data.
|
---|
79 | S INID=+$P($G(^PXRM(800,1,"MST")),U,1)
|
---|
80 | I INID>0 D
|
---|
81 | . S $P(^PXRM(800,1,"MST"),U,3)=$$NOW^XLFDT
|
---|
82 | . S $P(^PXRM(800,1,"MST"),U,4)=NUMUPD
|
---|
83 | . S $P(^PXRM(800,1,"MST"),U,6)=START
|
---|
84 | E D
|
---|
85 | . S $P(^PXRM(800,1,"MST"),U,1)=$$NOW^XLFDT
|
---|
86 | . S $P(^PXRM(800,1,"MST"),U,2)=NUMUPD
|
---|
87 | . S $P(^PXRM(800,1,"MST"),U,5)=START
|
---|
88 | ;
|
---|
89 | ;Cleanup the task stuff.
|
---|
90 | I STIME=-1 S ZTREQ="@" Q
|
---|
91 | E D
|
---|
92 | . S TEMP=$G(^PXRM(800,1,"MST"))
|
---|
93 | . S LTIME=+$P(TEMP,U,3)
|
---|
94 | . I LTIME=0 S LTIME=+$P(TEMP,U,1)
|
---|
95 | .;Adding STIME sets the new starting time at exactly one day following
|
---|
96 | .;the previous starting time.
|
---|
97 | . S $P(ZTREQ,U,1)=$P(LTIME,".",1)+STIME
|
---|
98 | Q
|
---|
99 | ;
|
---|
100 | ;====================================================
|
---|
101 | SYNREP ;Provide a report of the synchronization data.
|
---|
102 | N EDTIME,EITIME,IDATE,LDATE,NIUPD,NLUPD,TEMP
|
---|
103 | S TEMP=$G(^PXRM(800,1,"MST"))
|
---|
104 | S IDATE=$$FMTE^XLFDT($P(TEMP,U,1))
|
---|
105 | I IDATE=0 S IDATE="none"
|
---|
106 | S NIUPD=$P(TEMP,U,2)
|
---|
107 | S EITIME=$$FMDIFF^XLFDT($P(TEMP,U,1),$P(TEMP,U,5),2)
|
---|
108 | S LDATE=$$FMTE^XLFDT($P(TEMP,U,3))
|
---|
109 | I LDATE=0 S LDATE="none"
|
---|
110 | S NLUPD=$P(TEMP,U,4)
|
---|
111 | S EDTIME=$$FMDIFF^XLFDT($P(TEMP,U,3),$P(TEMP,U,6),2)
|
---|
112 | W !!,"Clinical Reminders MST Synchronization Report"
|
---|
113 | W !,"---------------------------------------------"
|
---|
114 | W !,"Initial synchronization date: ",IDATE
|
---|
115 | W !,"Number of updates made: ",NIUPD
|
---|
116 | I EITIME>60 D
|
---|
117 | . S EITIME=$$FMDIFF^XLFDT($P(TEMP,U,1),$P(TEMP,U,5),3)
|
---|
118 | . W !,"Elapsed time: ",EITIME
|
---|
119 | E W !,"Elapsed time: ",EITIME," secs"
|
---|
120 | W !!,"Last daily synchronization date: ",LDATE
|
---|
121 | W !,"Number of updates made: ",NLUPD
|
---|
122 | I EDTIME>60 D
|
---|
123 | . S EDTIME=$$FMDIFF^XLFDT($P(TEMP,U,3),$P(TEMP,U,6),3)
|
---|
124 | . W !,"Elapsed time: ",EDTIME
|
---|
125 | E W !,"Elapsed time: ",EDTIME," secs"
|
---|
126 | Q
|
---|
127 | ;
|
---|
128 | ;====================================================
|
---|
129 | UPDATE(DFN,VISIT,SOURCE,STCODE,TYPE) ;Make an update to the MST History file.
|
---|
130 | N DATE,MSTDATE,PROV,STAT,TEMP,UPDSTAT,VPRVIEN
|
---|
131 | S UPDSTAT=-1
|
---|
132 | ;If the update is because of a protocol event use NOW for the
|
---|
133 | ;date/time. If it is being done as part of a synchronization use
|
---|
134 | ;the date the visit was created.
|
---|
135 | S DATE=$S(TYPE="PROTOCOL":$$NOW^XLFDT,1:$P($G(^AUPNVSIT(VISIT,0)),U,2))
|
---|
136 | ;If the date does not contain the time use noon.
|
---|
137 | I DATE'["." S DATE=DATE_".12"
|
---|
138 | S STAT=$$GETSTAT^DGMSTAPI(DFN)
|
---|
139 | S MSTDATE=$S($P(STAT,U,1)>0:$P(STAT,U,3),1:0)
|
---|
140 | I DATE>MSTDATE D
|
---|
141 | .;Determine the provider.
|
---|
142 | . S TEMP=$P(SOURCE,";",2)_$P(SOURCE,";",1)_",12)"
|
---|
143 | . S PROV=$P($G(@TEMP),U,4)
|
---|
144 | . I PROV="" D
|
---|
145 | ..;DBIA #2316
|
---|
146 | .. S VPRVIEN=+$O(^AUPNVPRV("AD",VISIT,""))
|
---|
147 | .. I VPRVIEN>0 S PROV=$P(^AUPNVPRV(VPRVIEN,0),U,1)
|
---|
148 | . S UPDSTAT=$$NEWSTAT^DGMSTAPI(DFN,STCODE,DATE,PROV)
|
---|
149 | . I +UPDSTAT=-1 D
|
---|
150 | .. N FN,GBL,IEN,NAME,TARGET,XMSUB,VADM
|
---|
151 | .. K ^TMP("PXRMXMZ",$J)
|
---|
152 | .. S XMSUB="CLINICAL REMINDER MST UPDATE PROBLEM"
|
---|
153 | .. S ^TMP("PXRMXMZ",$J,1,0)="NEWSTAT^DGMSTAPI returned the following error:"
|
---|
154 | .. S ^TMP("PXRMXMZ",$J,2,0)=$P(UPDSTAT,U,2)
|
---|
155 | .. S ^TMP("PXRMXMZ",$J,3,0)="The following data was passed to NEWSTAT^DGMSTAPI"
|
---|
156 | .. S ^TMP("PXRMXMZ",$J,4,0)="DFN = "_DFN
|
---|
157 | .. S ^TMP("PXRMXMZ",$J,5,0)="Status code = "_STCODE
|
---|
158 | .. S ^TMP("PXRMXMZ",$J,6,0)="Date = "_DATE
|
---|
159 | .. S ^TMP("PXRMXMZ",$J,7,0)="Provider = "_PROV
|
---|
160 | .. S ^TMP("PXRMXMZ",$J,8,0)="Data source = "_SOURCE
|
---|
161 | .. S ^TMP("PXRMXMZ",$J,9,0)="This corresponds to the following:"
|
---|
162 | .. D DEM^VADPT
|
---|
163 | .. S ^TMP("PXRMXMZ",$J,10,0)="Patient = "_VADM(1)
|
---|
164 | .. S ^TMP("PXRMXMZ",$J,11,0)="SSN = "_$P(VADM(2),U,2)
|
---|
165 | .. S ^TMP("PXRMXMZ",$J,12,0)="MST Status = "_$$EXTERNAL^DILFD(29.11,3,"",STCODE)
|
---|
166 | .. S ^TMP("PXRMXMZ",$J,13,0)="Date = "_$$FMTE^XLFDT(DATE,"5Z")
|
---|
167 | .. S TEMP=$S(PROV="":"Unknown",1:TEMP=$$GET1^DIQ(200,PROV,.01,"","",""))
|
---|
168 | .. I TEMP="" S TEMP="Unknown"
|
---|
169 | .. S ^TMP("PXRMXMZ",$J,14,0)="Provider = "_TEMP
|
---|
170 | .. S GBL=$P($P(SOURCE,";",2),"(",1)
|
---|
171 | .. S TEMP=GBL_"(0)"
|
---|
172 | .. S FN=+$P(@TEMP,U,2)
|
---|
173 | .. S TEMP=GBL_"("_$P(SOURCE,";",1)_",0)"
|
---|
174 | .. S TEMP=$G(@TEMP)
|
---|
175 | .. S IEN=$P(TEMP,U,1)
|
---|
176 | .. D FIELD^DID(FN,.01,"N","POINTER","TARGET")
|
---|
177 | .. S GBL="^"_$P(TARGET("POINTER"),"(",1)
|
---|
178 | .. S TEMP=GBL_"(0)"
|
---|
179 | .. S FN=$P(@TEMP,U,1)
|
---|
180 | .. S TEMP=GBL_"("_IEN_",0)"
|
---|
181 | .. S NAME=$P(@TEMP,U,1)
|
---|
182 | .. S ^TMP("PXRMXMZ",$J,14,0)="Data type = "_FN
|
---|
183 | .. S ^TMP("PXRMXMZ",$J,15,0)="Name = "_NAME
|
---|
184 | .. D SEND^PXRMMSG(XMSUB)
|
---|
185 | Q UPDSTAT
|
---|
186 | ;
|
---|
187 | ;====================================================
|
---|
188 | UPDPAT(DFN,VISIT,VFL) ;Update the MST history file for a single patient
|
---|
189 | ;using term mappings. Called from DATACHG^PXRMPINF which is invoked
|
---|
190 | ;by the protocol PXK VISIT DATA EVENT.
|
---|
191 | N AFTER,BEFORE,DGBL,SP,STCODE,SIEN,SOURCE
|
---|
192 | N TEMP,TERM,TERMIEN,VF
|
---|
193 | ;Search all the MST terms to build patient lists.
|
---|
194 | F TERM="VA-MST DECLINES REPORT","VA-MST NEGATIVE REPORT","VA-MST POSITIVE REPORT" D
|
---|
195 | . S TERMIEN=$O(^PXRMD(811.5,"B",TERM,""))
|
---|
196 | . S VF=""
|
---|
197 | . F S VF=$O(VFL(VF)) Q:VF="" D
|
---|
198 | .. I VFL(VF)=U Q
|
---|
199 | .. S DGBL=$P(VFL(VF),U,1)
|
---|
200 | .. I '$D(^PXRMD(811.5,TERMIEN,20,"E",DGBL)) Q
|
---|
201 | .. S SIEN=""
|
---|
202 | .. F S SIEN=$O(^TMP("PXKCO",$J,VISIT,VF,SIEN)) Q:SIEN="" D
|
---|
203 | ... S AFTER=$G(^TMP("PXKCO",$J,VISIT,VF,SIEN,0,"AFTER"))
|
---|
204 | ... S BEFORE=$G(^TMP("PXKCO",$J,VISIT,VF,SIEN,0,"BEFORE"))
|
---|
205 | ... I AFTER=BEFORE Q
|
---|
206 | ... S SP=$P(AFTER,U,1)
|
---|
207 | ... I SP="" Q
|
---|
208 | ... I '$D(^PXRMD(811.5,TERMIEN,20,"E",DGBL,SP)) Q
|
---|
209 | ... S SOURCE=SIEN_";^"_$P(VFL(VF),U,2)
|
---|
210 | ...;The status code depends on the term name.
|
---|
211 | ... S STCODE=$$STCODE(TERM)
|
---|
212 | ... S TEMP=$$UPDATE(DFN,VISIT,SOURCE,STCODE,"PROTOCOL")
|
---|
213 | Q
|
---|
214 | ;
|
---|
215 | ;====================================================
|
---|
216 | UPDSTAT(NUMUPD,START) ;Update the MST history file using term mappings.
|
---|
217 | N DAS,DATA,DFN,FILENUM,FINDPA,INDEX,ITEM,NOCC,STCODE,SOURCE
|
---|
218 | N TEMP,TERM,TERMARR,TERMIEN,UPDSTAT,VDATE,VISIT
|
---|
219 | S FINDPA=""
|
---|
220 | ;Set the start time for the synchronization.
|
---|
221 | S START=$$NOW^XLFDT
|
---|
222 | S INDEX="PXRM_MST_LIST"
|
---|
223 | S NUMUPD=0
|
---|
224 | ;Search all the MST terms to build patient lists. Only V file data
|
---|
225 | ;is used for the update.
|
---|
226 | F TERM="VA-MST DECLINES REPORT","VA-MST NEGATIVE REPORT","VA-MST POSITIVE REPORT" D
|
---|
227 | . K TERMARR,^TMP($J,INDEX)
|
---|
228 | .;The status code depends on the term name.
|
---|
229 | . S STCODE=$$STCODE(TERM)
|
---|
230 | . S TERMIEN=$O(^PXRMD(811.5,"B",TERM,""))
|
---|
231 | . I TERMIEN="" Q
|
---|
232 | . D TERM^PXRMLDR(TERMIEN,.TERMARR)
|
---|
233 | . D EVALPL^PXRMTERM(.FINDPA,.TERMARR,INDEX)
|
---|
234 | . S DFN=0
|
---|
235 | . F S DFN=+$O(^TMP($J,INDEX,1,DFN)) Q:DFN=0 D
|
---|
236 | .. S ITEM=""
|
---|
237 | .. F S ITEM=$O(^TMP($J,INDEX,1,DFN,ITEM)) Q:ITEM="" D
|
---|
238 | ... S NOCC=0
|
---|
239 | ... F S NOCC=$O(^TMP($J,INDEX,1,DFN,ITEM,NOCC)) Q:NOCC="" D
|
---|
240 | .... S FILENUM=""
|
---|
241 | .... F S FILENUM=$O(^TMP($J,INDEX,1,DFN,ITEM,NOCC,FILENUM)) Q:FILENUM="" D
|
---|
242 | ..... S TEMP=^TMP($J,INDEX,1,DFN,ITEM,NOCC,FILENUM)
|
---|
243 | ..... S DAS=$P(TEMP,U,1)
|
---|
244 | ..... K DATA
|
---|
245 | ..... D GETDATA^PXRMDATA(FILENUM,DAS,.DATA)
|
---|
246 | ..... S VISIT=$G(DATA("VISIT"))
|
---|
247 | ..... I VISIT="" Q
|
---|
248 | ..... S SOURCE=DAS_";"_^PXRMINDX(FILENUM,"GLOBAL NAME")
|
---|
249 | ..... S UPDSTAT=$$UPDATE(DFN,VISIT,SOURCE,STCODE,"SYNCH")
|
---|
250 | ..... I UPDSTAT'=-1 S NUMUPD=NUMUPD+1
|
---|
251 | K ^TMP($J,INDEX)
|
---|
252 | Q
|
---|
253 | ;
|
---|