| 1 | PXRM ; SLC/PKR - Clinical Reminders entry points. ; 06/09/2006 | 
|---|
| 2 | ;;2.0;CLINICAL REMINDERS;**4**;Feb 04, 2005;Build 21 | 
|---|
| 3 | ;Entry points in this routine are listed in DBIA #2182. | 
|---|
| 4 | ;========================================================== | 
|---|
| 5 | MAIN(DFN,PXRMITEM,OUTTYPE,DISC) ;Main driver for clinical reminders. | 
|---|
| 6 | ;INPUT  DFN - Pointer to Patient File (#2) | 
|---|
| 7 | ;       PXRMITEM - IEN of reminder to evaluate. | 
|---|
| 8 | ;       OUTTYPE - Flag to indicate type of output information. | 
|---|
| 9 | ;         0 - Reminders DUE NOW only (CLINICAL REMINDERS DUE | 
|---|
| 10 | ;             HS component) | 
|---|
| 11 | ;         1 - All Reminders with Next and Last Information | 
|---|
| 12 | ;             (CLINICAL REMINDERS SUMMARY HS component) | 
|---|
| 13 | ;         5 - Health Maintenance (CLINICAL REMINDERS MAINTENANCE | 
|---|
| 14 | ;              HS component) | 
|---|
| 15 | ;        10 - MyHealtheVet summary | 
|---|
| 16 | ;        11 - MyHealtheVet detailed | 
|---|
| 17 | ;        12 - MyHealtheVet combined | 
|---|
| 18 | ;        DISC - (optional) if this is true then the disclaimer will | 
|---|
| 19 | ;             be loaded in ^TMP("PXRM",$J,"DISC"). | 
|---|
| 20 | ; | 
|---|
| 21 | ;OUTPUT  ^TMP("PXRHM",$J,PXRMITEM,PXRMRNAM)= | 
|---|
| 22 | ;              STATUS_U_DUE DATE_U_LAST DONE | 
|---|
| 23 | ;        where PXRMRNAM is the PRINT NAME or if it is undefined then | 
|---|
| 24 | ;        it is the NAME (.01). | 
|---|
| 25 | ;        For the Clinical Maintenance component, OUTTYPE=5, there is | 
|---|
| 26 | ;        subsequent output of the form | 
|---|
| 27 | ;        ^TMP("PXRHM",$J,PXRMITEM,PXRMRNAM,"TXT",N)=TEXT | 
|---|
| 28 | ;        where N is a number and TEXT is a text string. | 
|---|
| 29 | ; | 
|---|
| 30 | ;        If DISC is true then the disclaimer will be loaded into | 
|---|
| 31 | ;        ^TMP("PXRM",$J,"DISC"). The calling application should | 
|---|
| 32 | ;        delete this when it is done. | 
|---|
| 33 | ; | 
|---|
| 34 | ;        The calling application can display the contents of these | 
|---|
| 35 | ;        two ^TMP arrays as it chooses. The caller should also make | 
|---|
| 36 | ;        sure the ^TMP globals are killed before it exits. | 
|---|
| 37 | ; | 
|---|
| 38 | N DEFARR,FIEVAL | 
|---|
| 39 | ;Load the definition into DEFARR. | 
|---|
| 40 | D DEF^PXRMLDR(PXRMITEM,.DEFARR) | 
|---|
| 41 | ; | 
|---|
| 42 | I $G(NODISC)="" S NODISC=1 | 
|---|
| 43 | I $D(GMFLAG) S NODISC=0 | 
|---|
| 44 | D EVAL(DFN,.DEFARR,OUTTYPE,NODISC,.FIEVAL) | 
|---|
| 45 | Q | 
|---|
| 46 | ; | 
|---|
| 47 | ;========================================================== | 
|---|
| 48 | EVAL(DFN,DEFARR,OUTTYPE,NODISC,FIEVAL,DATE) ;Reminder evaluation entry | 
|---|
| 49 | ;point. This entry point uses the local array DEFARR for the reminder | 
|---|
| 50 | ;definition and returns the Finding Evaluation Array, FIEVAL. | 
|---|
| 51 | ;PXRM namespaced variables are the reminder evaluation "global" | 
|---|
| 52 | ;variables. If date is specified then the reminder will be evaluated | 
|---|
| 53 | ;as if the current date is DATE. | 
|---|
| 54 | N PXRMAGE,PXRMDATE,PXRMDOB,PXRMDOD,PXRMLAD,PXRMPDEM,PXRMPID,PXRMITEM | 
|---|
| 55 | N PXRMRM,PXRMRNAM,PXRMSEX,PXRMXTLK | 
|---|
| 56 | ;Make sure the reminder exists. | 
|---|
| 57 | I $D(DEFARR("DNE")) D NODEF^PXRMERRH(DEFARR("IEN")) Q | 
|---|
| 58 | ;PXRMRM is the right margin for output. | 
|---|
| 59 | S PXRMRM=70 | 
|---|
| 60 | S PXRMDATE=$G(DATE) | 
|---|
| 61 | S PXRMITEM=DEFARR("IEN") | 
|---|
| 62 | S PXRMPID="PXRM"_PXRMITEM_$H | 
|---|
| 63 | N D00 | 
|---|
| 64 | S D00=DEFARR(0) | 
|---|
| 65 | S PXRMRNAM=$P(D00,U,3) | 
|---|
| 66 | ;If the print name is null use the .01. | 
|---|
| 67 | I PXRMRNAM="" S PXRMRNAM=$P(D00,U,1) | 
|---|
| 68 | ; | 
|---|
| 69 | ;Set the error handler to the PXRMERRH routine. Use the new style of | 
|---|
| 70 | ;error trapping. | 
|---|
| 71 | N $ES,$ET | 
|---|
| 72 | S $ET="D ERRHDLR^PXRMERRH" | 
|---|
| 73 | ; | 
|---|
| 74 | ;Initialize the working array. | 
|---|
| 75 | K ^TMP(PXRMPID,$J) | 
|---|
| 76 | ; | 
|---|
| 77 | N DUE,DUEDATE,FREQ,PCLOGIC,RESDATE,RESLOGIC | 
|---|
| 78 | ;Make sure the reminder is active. | 
|---|
| 79 | I $P(D00,U,6) D  G OUTPUT | 
|---|
| 80 | . S ^TMP(PXRMPID,$J,PXRMITEM,"N/A","INACTIVE")="The reminder "_PXRMRNAM_" was inactivated "_$$FMTE^XLFDT($P(D00,U,7),"5Z") | 
|---|
| 81 | . S PXRMPDEM("DFN")=DFN,PCLOGIC=0,RESLOGIC="",DUE="",DUEDATE=0 | 
|---|
| 82 | . S RESDATE="",FREQ="0Y" | 
|---|
| 83 | ; | 
|---|
| 84 | ;Make sure the "E" node exists | 
|---|
| 85 | I $D(DEFARR(20))&'$D(DEFARR("E")) D  G EXIT | 
|---|
| 86 | . W !,"Reminder definition is corrupted, ENODE is missing cannot continue!" | 
|---|
| 87 | . S ^TMP("PXRHM",$J,PXRMITEM,PXRMRNAM)="ERROR"_U_"E NODE MISSING" | 
|---|
| 88 | . S ^TMP(PXRMPID,$J,PXRMITEM,"FERROR","NO ENODE")="" | 
|---|
| 89 | ; | 
|---|
| 90 | ;Establish the main findings evaluation variables. | 
|---|
| 91 | S (DUE,DUEDATE,FREQ,RESDATE)=0 | 
|---|
| 92 | S (PCLOGIC,RESLOGIC)="" | 
|---|
| 93 | ; | 
|---|
| 94 | ;Establish the patient demographic information. | 
|---|
| 95 | N TODAY | 
|---|
| 96 | S TODAY=$G(DATE,DT) | 
|---|
| 97 | D DEM^PXRMPINF(DFN,TODAY,.PXRMPDEM) | 
|---|
| 98 | I PXRMPDEM("PATIENT")="" D  G EXIT | 
|---|
| 99 | . S ^TMP(PXRMPID,$J,PXRMITEM,"FERROR","PATIENT","NO PAT")="DFN "_DFN_" IS NOT A VALID PATIENT" | 
|---|
| 100 | . S PCLOGIC=0 | 
|---|
| 101 | ; | 
|---|
| 102 | ;Load the local demographic variables for use in condition. | 
|---|
| 103 | S PXRMAGE=PXRMPDEM("AGE"),PXRMDOB=PXRMPDEM("DOB"),PXRMDOD=PXRMPDEM("DOD") | 
|---|
| 104 | S PXRMLAD=PXRMPDEM("LAD"),PXRMSEX=PXRMPDEM("SEX") | 
|---|
| 105 | ; | 
|---|
| 106 | ;Check for a date of death. | 
|---|
| 107 | I PXRMPDEM("DOD")'="" D | 
|---|
| 108 | . S ^TMP(PXRMPID,$J,PXRMITEM,"N/A","DEAD")="" | 
|---|
| 109 | . S ^TMP(PXRMPID,$J,PXRMITEM,"DEAD")="Patient is deceased." | 
|---|
| 110 | ; | 
|---|
| 111 | ;If the component is CR and the patient is deceased we are done. | 
|---|
| 112 | I OUTTYPE=0,PXRMPDEM("DOD")'="",'$G(PXRMIDOD) G OUTPUT | 
|---|
| 113 | ; | 
|---|
| 114 | ;Check for a sex specific reminder. | 
|---|
| 115 | N SEXOK | 
|---|
| 116 | S SEXOK=$$SEX^PXRMLOG(.DEFARR,PXRMPDEM("SEX")) | 
|---|
| 117 | S FIEVAL("SEX")=SEXOK | 
|---|
| 118 | ;If the patient is the wrong sex then don't do anything else. | 
|---|
| 119 | I 'SEXOK D  G OUTPUT | 
|---|
| 120 | . S PCLOGIC=0 | 
|---|
| 121 | . S ^TMP(PXRMPID,$J,PXRMITEM,"N/A","SEX")="" | 
|---|
| 122 | . S ^TMP(PXRMPID,$J,PXRMITEM,"INFO","SEX")="Patient is the wrong sex!" | 
|---|
| 123 | ; | 
|---|
| 124 | ;Evaluate the findings. | 
|---|
| 125 | S PXRMXTLK="" | 
|---|
| 126 | D EVAL^PXRMEVFI(DFN,.DEFARR,.FIEVAL) | 
|---|
| 127 | I +PXRMXTLK>0 D  G OUTPUT | 
|---|
| 128 | . S ^TMP(PXRMPID,$J,PXRMITEM,"FERROR","EXPANDED TAXONOMY","NO LOCK")="NO LOCK for ien "_+PXRMXTLK | 
|---|
| 129 | . S PCLOGIC=0 | 
|---|
| 130 | ; | 
|---|
| 131 | ;Check for missing index. | 
|---|
| 132 | I $D(^TMP(PXRMPID,$J,PXRMITEM,"WARNING","MISSING INDEX")) D  G OUTPUT | 
|---|
| 133 | . S (DUE,DUEDATE)="CNBD",PCLOGIC=1 | 
|---|
| 134 | ; | 
|---|
| 135 | ;Evaluate the Patient Cohort Logic. | 
|---|
| 136 | D EVALPCL^PXRMLOG(.DEFARR,.PXRMPDEM,.FREQ,.PCLOGIC,.FIEVAL) | 
|---|
| 137 | ; | 
|---|
| 138 | ;Evaluate the resolution logic and get the last resolution date. | 
|---|
| 139 | D EVALRESL^PXRMLOG(.DEFARR,.RESDATE,.RESLOGIC,.FIEVAL) | 
|---|
| 140 | ; | 
|---|
| 141 | ;If the reminder is applicable calculate the due date. | 
|---|
| 142 | I PCLOGIC D DUE^PXRMDATE(.DEFARR,RESDATE,FREQ,.DUE,.DUEDATE,.FIEVAL) | 
|---|
| 143 | ; | 
|---|
| 144 | OUTPUT ;Prepare the final output. | 
|---|
| 145 | D OUTPUT^PXRMOUTD(OUTTYPE,.DEFARR,.PXRMPDEM,PCLOGIC,RESLOGIC,DUE,DUEDATE,RESDATE,FREQ,.FIEVAL) | 
|---|
| 146 | ; | 
|---|
| 147 | EXIT ;Kill the working arrays unless this was a test run. | 
|---|
| 148 | I $G(PXRMDEBG) D | 
|---|
| 149 | . S PXRMID=PXRMPID | 
|---|
| 150 | . S FIEVAL("PATIENT AGE")=$G(PXRMPDEM("AGE")) | 
|---|
| 151 | . S FIEVAL("DFN")=DFN | 
|---|
| 152 | . S FIEVAL("EVAL DATE/TIME")=$$NOW^PXRMDATE | 
|---|
| 153 | . S ^TMP(PXRMPID,$J,PXRMITEM,"REMINDER NAME")=$G(PXRMRNAM) | 
|---|
| 154 | E  K ^TMP(PXRMPID,$J) | 
|---|
| 155 | ; | 
|---|
| 156 | ;I DISC is true load the disclaimer. | 
|---|
| 157 | I $G(DISC) D LOAD^PXRMDISC | 
|---|
| 158 | Q | 
|---|
| 159 | ; | 
|---|
| 160 | ;========================================================== | 
|---|
| 161 | FIDATA(DFN,PXRMITEM,FINDINGS) ;Return the finding evaluation array to the | 
|---|
| 162 | ;caller in the array FINDINGS. The caller should use the form | 
|---|
| 163 | ;D FIDATA^PXRM(DFN,PXRMITEM,.FINDINGS) | 
|---|
| 164 | ;The elements of the FINDINGS array will correspond to the | 
|---|
| 165 | ;findings in the reminder definition. For finding N FINDINGS(N) | 
|---|
| 166 | ;will be 0 if the finding is false and 1 if it is true. For | 
|---|
| 167 | ;true findings there will be additional elements. The exact set | 
|---|
| 168 | ;of additional elements will depend of the type of finding. | 
|---|
| 169 | ;Some typical examples are: | 
|---|
| 170 | ;FINDINGS(N)=1 | 
|---|
| 171 | ;FINDINGS(N,"DATE")=FileMan date | 
|---|
| 172 | ;FINDINGS(N,"FINDING")=variable pointer to the finding | 
|---|
| 173 | ;FINDINGS(N,"FILE NUMBER")=file number of data source | 
|---|
| 174 | ;FINDINGS(N,"VALUE")=value of the finding, for example the | 
|---|
| 175 | ;                    value of a lab test | 
|---|
| 176 | ; | 
|---|
| 177 | N DEFARR,FI,FIEVAL | 
|---|
| 178 | ;Load the definition into DEFARR. | 
|---|
| 179 | D DEF^PXRMLDR(PXRMITEM,.DEFARR) | 
|---|
| 180 | D EVAL(DFN,.DEFARR,0,1,.FIEVAL) | 
|---|
| 181 | K ^TMP("PXRM",$J),^TMP("PXRHM",$J) | 
|---|
| 182 | ;Load the FINDINGS array. | 
|---|
| 183 | S FI=0 | 
|---|
| 184 | F  S FI=+$O(FIEVAL(FI)) Q:FI=0  D | 
|---|
| 185 | . S FINDINGS(FI)=FIEVAL(FI) | 
|---|
| 186 | . I 'FIEVAL(FI) Q | 
|---|
| 187 | . S FINDINGS(FI,"DATE")=FIEVAL(FI,"DATE") | 
|---|
| 188 | . I FIEVAL(FI,"FINDING")["PSDRUG" S FINDINGS(FI,"DRUG")=1 | 
|---|
| 189 | . S FINDINGS(FI,"FILE NUMBER")=FIEVAL(FI,"FILE NUMBER") | 
|---|
| 190 | . S FINDINGS(FI,"FINDING")=FIEVAL(FI,"FINDING") | 
|---|
| 191 | . I $D(FIEVAL(FI,"TERM")) S FINDINGS(FI,"TERM")=FIEVAL(FI,"TERM") | 
|---|
| 192 | . I $D(FIEVAL(FI,"VALUE")) S (FINDINGS(FI,"RESULT"),FINDINGS(FI,"VALUE"))=FIEVAL(FI,"VALUE") | 
|---|
| 193 | . I $D(FIEVAL(FI,"VISIT")) S FINDINGS(FI,"VIEN")=FIEVAL(FI,"VISIT") | 
|---|
| 194 | Q | 
|---|
| 195 | ; | 
|---|
| 196 | ;========================================================== | 
|---|
| 197 | INACTIVE(PXRMITEM) ;Return the INACTIVE FLAG, which has a value of 1 | 
|---|
| 198 | ;if the reminder is inactive. | 
|---|
| 199 | I '$D(^PXD(811.9,PXRMITEM)) Q 1 | 
|---|
| 200 | Q $P(^PXD(811.9,PXRMITEM,0),U,6) | 
|---|
| 201 | ; | 
|---|