| 1 | PXRMETXR ; SLC/PJH,PKR - Reminder section of extract ;02/22/2007 | 
|---|
| 2 | ;;2.0;CLINICAL REMINDERS;**4,6**;Feb 04, 2005;Build 123 | 
|---|
| 3 | ; | 
|---|
| 4 | ; Called from PXRMETX | 
|---|
| 5 | ; | 
|---|
| 6 | DATE ;Check if finding is most recent in evaluation group | 
|---|
| 7 | N FDATE,GDATE | 
|---|
| 8 | ;Determine finding date and existing group date | 
|---|
| 9 | S FDATE=$G(FIEV(FNUM,"DATE")),GDATE=$G(GROUP(GSEQ,"DATE")) Q:FDATE="" | 
|---|
| 10 | ;Ignore findings outside to the extract period | 
|---|
| 11 | ;I $$FMDIFF^XLFDT(PXRMSTRT,FDATE,2)>0 Q | 
|---|
| 12 | ;If this is first or only entry in group then save finding date | 
|---|
| 13 | I 'GDATE S GROUP(GSEQ,"DATE")=FDATE,GROUP(GSEQ)=FSEQ Q | 
|---|
| 14 | ;Save finding if most recent date for the group | 
|---|
| 15 | I $$FMDIFF^XLFDT(FDATE,GDATE,2)>0 S GROUP(GSEQ,"DATE")=FDATE,GROUP(GSEQ)=FSEQ Q | 
|---|
| 16 | Q | 
|---|
| 17 | ; | 
|---|
| 18 | FIND(SEQ,RCNT,PXRMSTRT,PXRMSTOP) ;Process findings for reminder | 
|---|
| 19 | ;Default is extract no findings | 
|---|
| 20 | N DATA,FCNT,FIEN,FIND,FNUM,FSEQ,GDATA,GROUP,GSEQ,GTYP | 
|---|
| 21 | S FNUM=0,FCNT=0 | 
|---|
| 22 | F  S FNUM=$O(FIEV(FNUM)) Q:'FNUM  D | 
|---|
| 23 | .;Ignore if not found for patient | 
|---|
| 24 | .I +FIEV(FNUM)=0 Q | 
|---|
| 25 | .;Only terms are counted | 
|---|
| 26 | .S FIND=$G(FIEV(FNUM,"TERM IEN")) Q:FIND="" | 
|---|
| 27 | .;Check if in list to be accumulated | 
|---|
| 28 | .I '$D(REM(RCNT,FIND)) Q | 
|---|
| 29 | .;Find groups to which finding belongs | 
|---|
| 30 | .S GSEQ="" | 
|---|
| 31 | .F  S GSEQ=$O(REM(RCNT,FIND,GSEQ)) Q:GSEQ=""  D | 
|---|
| 32 | ..;Determine Evaluation type | 
|---|
| 33 | ..S GTYP=REM(RCNT,FIND,GSEQ) | 
|---|
| 34 | ..;Ignore utilization groups | 
|---|
| 35 | ..I GTYP="UR" Q | 
|---|
| 36 | ..;Sequence determines where the finding will be stored | 
|---|
| 37 | ..S FSEQ="" | 
|---|
| 38 | ..F  S FSEQ=$O(REM(RCNT,FIND,GSEQ,FSEQ)) Q:FSEQ=""  D | 
|---|
| 39 | ...;Evaluation Group logic to save latest entry only | 
|---|
| 40 | ...I GTYP="MRFP" D DATE Q | 
|---|
| 41 | ...;Save finding totals | 
|---|
| 42 | ...D UPD(1) | 
|---|
| 43 | ; | 
|---|
| 44 | ;Check for group totals | 
|---|
| 45 | S GSEQ="" | 
|---|
| 46 | F  S GSEQ=$O(GROUP(GSEQ)) Q:GSEQ=""  D | 
|---|
| 47 | .S GDATA=$G(GROUP(GSEQ)) Q:GDATA="" | 
|---|
| 48 | .;Update if found | 
|---|
| 49 | .S FSEQ=$P(GDATA,U) D UPD(1) | 
|---|
| 50 | ; | 
|---|
| 51 | ;Utilization counts are done separately | 
|---|
| 52 | N CNT,FDATA,FIND,FINDPA,FTIEN,GTYP,TERMARR,TFIEVAL | 
|---|
| 53 | ;modify start date to include incomplete dates | 
|---|
| 54 | I $E(PXRMSTRT,6,7)="01" S PXRMSTRT=$E(PXRMSTRT,1,5)_"00" | 
|---|
| 55 | ;Include incomplete dates in January | 
|---|
| 56 | I $E(PXRMSTRT,4,5)="01" S PXRMSTRT=$E(PXRMSTRT,1,3)_"0000" | 
|---|
| 57 | ;Set start and stop dates for term | 
|---|
| 58 | ;S $P(FINDPA(0),U,8)=PXRMSTRT,$P(FINDPA(0),U,11)=PXRMSTOP | 
|---|
| 59 | S $P(FINDPA(0),U,11)=PXRMSTOP | 
|---|
| 60 | ;Count all entries | 
|---|
| 61 | S $P(FINDPA(0),U,14)="*" | 
|---|
| 62 | ; | 
|---|
| 63 | S FTIEN="",GTYP="UR" | 
|---|
| 64 | F  S FTIEN=$O(FUTIL(RCNT,FTIEN)) Q:FTIEN=""  D | 
|---|
| 65 | .S GSEQ="" | 
|---|
| 66 | .F  S GSEQ=$O(FUTIL(RCNT,FTIEN,GSEQ)) Q:GSEQ=""  D | 
|---|
| 67 | ..S FSEQ="" | 
|---|
| 68 | ..F  S FSEQ=$O(FUTIL(RCNT,FTIEN,GSEQ,FSEQ)) Q:FSEQ=""  D | 
|---|
| 69 | ...;Recover list of term findings | 
|---|
| 70 | ...K TERMARR M TERMARR=FUTIL(RCNT,FTIEN,GSEQ,FSEQ) | 
|---|
| 71 | ...;Process term | 
|---|
| 72 | ...K TFIEVAL D EVALTERM^PXRMTERM(DFN,.FINDPA,.TERMARR,.TFIEVAL) | 
|---|
| 73 | ...D URCNT(PXRMSTRT,PXRMSTOP,.TFIEVAL) | 
|---|
| 74 | ;Determine count from PLIST then add to ETX | 
|---|
| 75 | ;S CNT=+$O(PLIST(1,999999),-1) Q:'CNT | 
|---|
| 76 | ;D UPD(CNT) | 
|---|
| 77 | Q | 
|---|
| 78 | ; | 
|---|
| 79 | FRULE(FRIEN,RCNT,SEQ,REM,FUTIL) ;Build array of findings in the finding rule | 
|---|
| 80 | N DATA,FIND,FSEQ,GIEN,GNAM,GSEQ,GTYP,GSTA,SUB,TLIST | 
|---|
| 81 | S GSEQ=0 | 
|---|
| 82 | F  S GSEQ=$O(^PXRM(810.7,FRIEN,10,"B",GSEQ)) Q:GSEQ=""  D | 
|---|
| 83 | .S SUB=$O(^PXRM(810.7,FRIEN,10,"B",GSEQ,"")) Q:'SUB | 
|---|
| 84 | .S DATA=$G(^PXRM(810.7,FRIEN,10,SUB,0)) Q:DATA="" | 
|---|
| 85 | .;Get the finding group ien and reminder status | 
|---|
| 86 | .S GIEN=$P(DATA,U,2),GSTA=$P(DATA,U,3) Q:'GIEN | 
|---|
| 87 | .;If no status then report finding totals for all patients | 
|---|
| 88 | .I GSTA="" S GSTA="T" | 
|---|
| 89 | .;Get finding group info | 
|---|
| 90 | .S DATA=$G(^PXRM(810.8,GIEN,0)) Q:DATA="" | 
|---|
| 91 | .;Get group name and count type | 
|---|
| 92 | .S GTYP=$P(DATA,U,3),GNAM=$P(DATA,U) Q:GTYP="" | 
|---|
| 93 | .;Save group in workfile | 
|---|
| 94 | .S ^TMP("PXRMETX1",$J,SEQ,RCNT,GSEQ)=GNAM_U_GTYP_U_GSTA | 
|---|
| 95 | .;Get all findings in group | 
|---|
| 96 | .S FSEQ=0 | 
|---|
| 97 | .F  S FSEQ=$O(^PXRM(810.8,GIEN,10,"B",FSEQ)) Q:FSEQ=""  D | 
|---|
| 98 | ..S SUB=$O(^PXRM(810.8,GIEN,10,"B",FSEQ,"")) Q:'SUB | 
|---|
| 99 | ..S DATA=$G(^PXRM(810.8,GIEN,10,SUB,0)) Q:DATA="" | 
|---|
| 100 | ..;Get the finding ien and exclusion status | 
|---|
| 101 | ..S FIND=$P(DATA,U,2) Q:'FIND | 
|---|
| 102 | ..;Initialize count for finding | 
|---|
| 103 | ..S ^TMP("PXRMETX1",$J,SEQ,RCNT,GSEQ,FSEQ)=FIND | 
|---|
| 104 | ..;Reminder evaluation counts work from REM | 
|---|
| 105 | ..I GTYP'="UR" D  Q | 
|---|
| 106 | ...S REM(RCNT,FIND,GSEQ,FSEQ)="" | 
|---|
| 107 | ...S REM(RCNT,FIND,GSEQ)=GTYP | 
|---|
| 108 | ..;Utilization counts work from FUTIL | 
|---|
| 109 | ..D TERM^PXRMLDR(FIND,.TLIST) | 
|---|
| 110 | ..;Save TLIST | 
|---|
| 111 | ..M FUTIL(RCNT,FIND,GSEQ,FSEQ)=TLIST | 
|---|
| 112 | Q | 
|---|
| 113 | ; | 
|---|
| 114 | REM(SUB,PXRMLIST,PXRMSTRT,PXRMSTOP,PARTYPE) ;Run reminders against patient | 
|---|
| 115 | ;lists. | 
|---|
| 116 | N APPL,DATA,DEFARR,DEFSITE,DFN,DUE,FIEV,FRIEN,FUTIL,IND,INST | 
|---|
| 117 | N PXRMDATE,RCNT,REM,REMSEQ,RIEN,RNAM,STATUS,SUB1,TODAY | 
|---|
| 118 | N END,START | 
|---|
| 119 | ;S START=$H | 
|---|
| 120 | S TODAY=$$DT^XLFDT | 
|---|
| 121 | ;Evaluation date is period end except if the period is incomplete | 
|---|
| 122 | S PXRMDATE=$S($$FMDIFF^XLFDT(PXRMSTOP,TODAY,2)>0:TODAY,1:PXRMSTOP) | 
|---|
| 123 | ;Scan reminders for this parameter set | 
|---|
| 124 | S (RCNT,SUB1)=0 | 
|---|
| 125 | S REMSEQ="" | 
|---|
| 126 | F  S REMSEQ=$O(^PXRM(810.2,IEN,10,SUB,10,"B",REMSEQ)) Q:REMSEQ=""  D | 
|---|
| 127 | .F  S SUB1=$O(^PXRM(810.2,IEN,10,SUB,10,"B",REMSEQ,SUB1)) Q:'SUB1  D | 
|---|
| 128 | ..S DATA=$G(^PXRM(810.2,IEN,10,SUB,10,SUB1,0)) Q:DATA="" | 
|---|
| 129 | ..;Reminder ien | 
|---|
| 130 | ..S RIEN=$P(DATA,U,2) Q:'RIEN | 
|---|
| 131 | ..;Evaluation date is period end except if the period is incomplete. | 
|---|
| 132 | ..S PXRMDATE=$S($$FMDIFF^XLFDT(PXRMSTOP,TODAY,2)>0:TODAY,1:PXRMSTOP) | 
|---|
| 133 | ..;Finding Rule | 
|---|
| 134 | ..S FRIEN=$P(DATA,U,3) | 
|---|
| 135 | ..;Reminder print name | 
|---|
| 136 | ..S RNAM=$P($G(^PXD(811.9,RIEN,0)),U,3) | 
|---|
| 137 | ..I RNAM="" S RNAM=$P(^PXD(811.9,RIEN,0),U,1) | 
|---|
| 138 | ..;Save details to REM array | 
|---|
| 139 | ..S RCNT=RCNT+1,REM(RCNT)=RIEN_U_RNAM_U_FRIEN | 
|---|
| 140 | ..;Build list of terms from extract finding rule #810.7 | 
|---|
| 141 | ..I FRIEN D FRULE(FRIEN,RCNT,SEQ,.REM,.FUTIL) Q | 
|---|
| 142 | ..;If no extract finding rule defined collect all findings in reminder | 
|---|
| 143 | ..I 'FRIEN D REMF(RIEN,RCNT,SEQ,.REM) | 
|---|
| 144 | ; | 
|---|
| 145 | ;Process patient list | 
|---|
| 146 | S IND=0,DEFSITE=+$P($$SITE^VASITE,U,3) | 
|---|
| 147 | F  S IND=$O(^PXRMXP(810.5,PXRMLIST,30,IND)) Q:'IND  D | 
|---|
| 148 | .S DFN=$P($G(^PXRMXP(810.5,PXRMLIST,30,IND,0)),U) Q:'DFN | 
|---|
| 149 | .S INST=$P($G(^PXRMXP(810.5,PXRMLIST,30,IND,0)),U,2) | 
|---|
| 150 | .I INST="" S INST=DEFSITE | 
|---|
| 151 | .S RCNT=0 | 
|---|
| 152 | .F  S RCNT=$O(REM(RCNT)) Q:'RCNT  D | 
|---|
| 153 | ..S RIEN=$P(REM(RCNT),U),RNAM=$P(REM(RCNT),U,2),FRIEN=$P(REM(RCNT),U,3) | 
|---|
| 154 | ..;Clear evaluation arrays. | 
|---|
| 155 | ..K ^TMP("PXRHM",$J),^TMP("PXRMID",$J),FIEV | 
|---|
| 156 | ..;Evaluate reminders and store results | 
|---|
| 157 | ..D DEF^PXRMLDR(RIEN,.DEFARR) | 
|---|
| 158 | ..D EVAL^PXRM(DFN,.DEFARR,1,1,.FIEV,PXRMDATE) | 
|---|
| 159 | ..;Determine update from reminder status | 
|---|
| 160 | ..S STATUS=$P($G(^TMP("PXRHM",$J,RIEN,RNAM)),U) I STATUS="" Q | 
|---|
| 161 | ..;Ignore not applicables | 
|---|
| 162 | ..S APPL=$S(STATUS["DUE":1,STATUS="RESOLVED":1,STATUS="DONE":1,1:0) | 
|---|
| 163 | ..;Check if due | 
|---|
| 164 | ..S DUE=$S(STATUS="DUE NOW":1,1:0) | 
|---|
| 165 | ..;Compliance totals | 
|---|
| 166 | ..S DATA=$G(^TMP("PXRMETX",$J,SEQ,INST,RCNT)) | 
|---|
| 167 | ..;Reminder ien | 
|---|
| 168 | ..I $P(DATA,U)="" S $P(DATA,U)=RIEN | 
|---|
| 169 | ..;Evaluated total | 
|---|
| 170 | ..S $P(DATA,U,2)=$P(DATA,U,2)+1 | 
|---|
| 171 | ..;Applicable total | 
|---|
| 172 | ..S $P(DATA,U,3)=$P(DATA,U,3)+APPL | 
|---|
| 173 | ..;Not applicable total | 
|---|
| 174 | ..I 'APPL,'DUE S $P(DATA,U,4)=$P(DATA,U,4)+1 | 
|---|
| 175 | ..;Due total | 
|---|
| 176 | ..S $P(DATA,U,5)=$P(DATA,U,5)+DUE | 
|---|
| 177 | ..;Not due count | 
|---|
| 178 | ..I APPL,'DUE S $P(DATA,U,6)=$P(DATA,U,6)+1 | 
|---|
| 179 | ..;Add patient list | 
|---|
| 180 | ..I $P(DATA,U,7)="" S $P(DATA,U,7)=PXRMLIST | 
|---|
| 181 | ..;Update workfile | 
|---|
| 182 | ..S ^TMP("PXRMETX",$J,SEQ,INST,RCNT)=DATA | 
|---|
| 183 | ..;Save finding totals | 
|---|
| 184 | ..I PARTYPE="CF" D FIND(SEQ,RCNT,PXRMSTRT,PXRMSTOP) | 
|---|
| 185 | ;Clear evaluation fields | 
|---|
| 186 | K ^TMP("PXRHM",$J),^TMP("PXRMID",$J) | 
|---|
| 187 | ;S END=$H | 
|---|
| 188 | ;W !,"REMINDER EVALUATION TIME" | 
|---|
| 189 | ;D DETIME^PXRMXSEL(START,END) | 
|---|
| 190 | Q | 
|---|
| 191 | ; | 
|---|
| 192 | REMF(RIEN,RCNT,SEQ,REM) ;Build array of all findings in the reminder | 
|---|
| 193 | N GNAM,GSEQ,FIND,FSEQ,GTYP,SUB | 
|---|
| 194 | S GNAM="Finding totals",GSEQ="001",FSEQ=0,GTYP="MRF" | 
|---|
| 195 | ;Save group name | 
|---|
| 196 | S ^TMP("PXRMETX",$J,SEQ,RCNT,GSEQ)=GNAM_U_GTYP | 
|---|
| 197 | ;Select all findings in the reminder | 
|---|
| 198 | S SUB=0 | 
|---|
| 199 | F  S SUB=$O(^PXD(811.9,RIEN,20,SUB)) Q:'SUB  D | 
|---|
| 200 | .;Ignore if finding is not a term | 
|---|
| 201 | .S FIND=$P($G(^PXD(811.9,RIEN,20,SUB,0)),U) Q:FIND'["PXRMD(811.5" | 
|---|
| 202 | .;Convert to term ien | 
|---|
| 203 | .S FIND=$P(FIND,";") | 
|---|
| 204 | .;Build sequence number | 
|---|
| 205 | .S FSEQ=FSEQ+1,FSEQ=$$RJ^XLFSTR(FSEQ,3,0) | 
|---|
| 206 | .;Evaluation counts | 
|---|
| 207 | .S REM(RCNT,FIND,GSEQ,FSEQ)="" | 
|---|
| 208 | .S REM(RCNT,FIND,GSEQ)=GTYP | 
|---|
| 209 | .;Update Workfile | 
|---|
| 210 | .S ^TMP("PXRMETX1",$J,SEQ,RCNT,GSEQ,FSEQ)=FIND | 
|---|
| 211 | Q | 
|---|
| 212 | ; | 
|---|
| 213 | URCNT(PXRMSTRT,PXRMSTOP,TFIEVAL) ; | 
|---|
| 214 | ;Handle counting all valid occurrences for the finding items. | 
|---|
| 215 | ;Includes historical entries that were entered within the reporting | 
|---|
| 216 | ;period, cut the encounter date if it is outside the reporting period. | 
|---|
| 217 | N CNT,DATEENT,FDATE,FILE,FNUM,FOCCNUM,HIST,NODE,SCAT,VIEN | 
|---|
| 218 | S CNT=0,FNUM=0 | 
|---|
| 219 | F  S FNUM=$O(TFIEVAL(FNUM)) Q:FNUM'>0  D | 
|---|
| 220 | .S FILE=$G(TFIEVAL(FNUM,"FILE NUMBER")) | 
|---|
| 221 | .S HIST=$S(FILE=9000010.18:1,FILE=9000010.13:1,FILE=9000010.23:1,FILE=9000010.16:1,FILE=9000010.07:1,FILE=9000010.12:1,FILE=9000010.15:1,1:0) | 
|---|
| 222 | .S FOCCNUM=0 F  S FOCCNUM=$O(TFIEVAL(FNUM,FOCCNUM)) Q:FOCCNUM'>0  D | 
|---|
| 223 | ..S FDATE=$P(TFIEVAL(FNUM,FOCCNUM,"DATE"),".") Q:FDATE'>0 | 
|---|
| 224 | ..I HIST=0,FDATE=PXRMSTRT!(FDATE>PXRMSTRT) S CNT=CNT+1 | 
|---|
| 225 | ..I HIST=1 D | 
|---|
| 226 | ...S VIEN=TFIEVAL(FNUM,FOCCNUM,"VISIT") Q:VIEN'>0 | 
|---|
| 227 | ...S NODE=$G(^AUPNVSIT(VIEN,0)) | 
|---|
| 228 | ...S SCAT=$P(NODE,U,7),DATEENT=$P($P(NODE,U,2),".") | 
|---|
| 229 | ...I FDATE=PXRMSTRT!(FDATE>PXRMSTRT),SCAT'="E" S CNT=CNT+1 Q | 
|---|
| 230 | ...I SCAT="E",(DATEENT=PXRMSTRT!(DATEENT>PXRMSTRT))&(DATEENT=PXRMSTOP!(DATEENT<PXRMSTOP)) S CNT=CNT+1 | 
|---|
| 231 | D UPD(CNT) | 
|---|
| 232 | Q | 
|---|
| 233 | ; | 
|---|
| 234 | UPD(CNT) ;Update totals | 
|---|
| 235 | S DATA=$G(^TMP("PXRMETX",$J,SEQ,INST,RCNT,GSEQ,FSEQ)) | 
|---|
| 236 | ;Total count | 
|---|
| 237 | S $P(DATA,U,2)=$P(DATA,U,2)+CNT | 
|---|
| 238 | ;Applicable count | 
|---|
| 239 | S $P(DATA,U,3)=$P(DATA,U,3)+(APPL*CNT) | 
|---|
| 240 | ;Not applicable count | 
|---|
| 241 | I 'APPL,'DUE S $P(DATA,U,4)=$P(DATA,U,4)+CNT | 
|---|
| 242 | ;Due count | 
|---|
| 243 | S $P(DATA,U,5)=$P(DATA,U,5)+(DUE*CNT) | 
|---|
| 244 | ;Not due count | 
|---|
| 245 | I APPL,'DUE S $P(DATA,U,6)=$P(DATA,U,6)+CNT | 
|---|
| 246 | ;Update current count | 
|---|
| 247 | S ^TMP("PXRMETX",$J,SEQ,INST,RCNT,GSEQ,FSEQ)=DATA | 
|---|
| 248 | ;AGP REMOVE UNTIL A DECISION CAN BE MADE | 
|---|
| 249 | ;I CNT=1,APPL=1 S ^TMP("PXRMETX",$J,SEQ,INST,RCNT,GSEQ,FSEQ,DFN)=DFN | 
|---|
| 250 | Q | 
|---|
| 251 | ; | 
|---|