| 1 | PXRMMST ; SLC/PKR - Routines for dealing with MST. ;03/29/2007
 | 
|---|
| 2 |  ;;2.0;CLINICAL REMINDERS;**4,6**;Feb 04, 2005;Build 123
 | 
|---|
| 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^PXRMTERL(.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 |  ;
 | 
|---|