| 1 | PXRMRULE ; SLC/PJH - Build Patient list from Rule Set ;03/27/2007 | 
|---|
| 2 | ;;2.0;CLINICAL REMINDERS;**4,6**;Feb 04, 2005;Build 123 | 
|---|
| 3 | ; | 
|---|
| 4 | ; Called from PXRM PATIENT LIST CREATE protocol | 
|---|
| 5 | ; | 
|---|
| 6 | CLEAR(RULE,NODE) ;Clear workfile entries | 
|---|
| 7 | N SEQ | 
|---|
| 8 | S SEQ="" | 
|---|
| 9 | F  S SEQ=$O(^PXRM(810.4,RULE,30,"B",SEQ)) Q:'SEQ  D | 
|---|
| 10 | .K ^TMP($J,NODE_SEQ) | 
|---|
| 11 | ;clear FDA array | 
|---|
| 12 | K ^TMP($J,"PXRMFDA") | 
|---|
| 13 | Q | 
|---|
| 14 | ; | 
|---|
| 15 | INTR ;Input transform for #810.4 fields | 
|---|
| 16 | Q | 
|---|
| 17 | ; | 
|---|
| 18 | LOAD(NODE,LIEN) ;Load Patient List | 
|---|
| 19 | N DATA,DFN,SUB | 
|---|
| 20 | S SUB=0 | 
|---|
| 21 | F  S SUB=$O(^PXRMXP(810.5,LIEN,30,SUB)) Q:'SUB  D | 
|---|
| 22 | .S DATA=$G(^PXRMXP(810.5,LIEN,30,SUB,0)),DFN=$P(DATA,U) Q:'DFN | 
|---|
| 23 | .;Store the patient IEN and institution in ^TMP | 
|---|
| 24 | .S ^TMP($J,NODE,DFN)=$P(DATA,U,2)_U_$P($G(DATA),U,3)_U_$P($G(DATA),U,4) | 
|---|
| 25 | Q | 
|---|
| 26 | ; | 
|---|
| 27 | PATS(FRACT,FROUT,PNODE,LIST) ;Process Patient List finding rule | 
|---|
| 28 | ; | 
|---|
| 29 | N LIEN,LUVALUE | 
|---|
| 30 | ;Insert year and period into extract list name | 
|---|
| 31 | I YEAR]"",LIST["yyyy" S LIST=$P(LIST,"yyyy")_YEAR_$P(LIST,"yyyy",2) | 
|---|
| 32 | I PERIOD]"",LIST["nn" S LIST=$P(LIST,"nn")_$E(PERIOD,2,10)_$P(LIST,"nn",2) | 
|---|
| 33 | ; | 
|---|
| 34 | S LUVALUE(1)=LIST | 
|---|
| 35 | S LIEN=+$$FIND1^DIC(810.5,"","KUX",.LUVALUE) Q:'LIEN | 
|---|
| 36 | ; | 
|---|
| 37 | ;Add operation Load list | 
|---|
| 38 | I FRACT="A" D LOAD(FROUT,LIEN) Q | 
|---|
| 39 | ; | 
|---|
| 40 | ;Remove or Select operations | 
|---|
| 41 | ;Load List | 
|---|
| 42 | D LOAD(PNODE,LIEN) | 
|---|
| 43 | ;Check each patient | 
|---|
| 44 | S DFN=0 | 
|---|
| 45 | F  S DFN=$O(^TMP($J,FROUT,DFN)) Q:'DFN  D | 
|---|
| 46 | .;Delete any ^TMP patient in PLIST if action is remove | 
|---|
| 47 | .I FRACT="R",$D(^TMP($J,PNODE,DFN)) K ^TMP($J,FROUT,DFN) Q | 
|---|
| 48 | .;Delete any ^TMP patient not in PLIST if action is select | 
|---|
| 49 | .I FRACT="S",'$D(^TMP($J,PNODE,DFN)) K ^TMP($J,FROUT,DFN) | 
|---|
| 50 | Q | 
|---|
| 51 | ; | 
|---|
| 52 | START(RULESET,LIST,NODE,LBBDT,LBEDT,PAR,YEAR,PERIOD,INDP,INTP,EXTITR) ; | 
|---|
| 53 | ;Process rule set | 
|---|
| 54 | ;Clear ^TMP | 
|---|
| 55 | D CLEAR(RULESET,NODE) | 
|---|
| 56 | ; | 
|---|
| 57 | N CLASS,FRACT,FRDATA,FRDATES,FRIEN,FRLST,FRLIEN,FROLST,FROUT,FRPAT | 
|---|
| 58 | N FRPERM,FRSTRT,FRTIEN,FRTYP,FSEQ,INC,INST,PXRMDATE,PXRMDDOC | 
|---|
| 59 | N RBDT,REDT,RRIEN,RSDATA,RSDATES,SEQ,SUB | 
|---|
| 60 | ;Get class from extract parameter | 
|---|
| 61 | I PAR S CLASS=$P($G(^PXRM(810.2,PAR,100)),U) | 
|---|
| 62 | ;Otherwise default to local | 
|---|
| 63 | I $G(CLASS)="" S CLASS="L" | 
|---|
| 64 | ;PXRMDDOC=1 save list rule evaluation dates in ^TMP("PXRMDDOC",$J) | 
|---|
| 65 | S PXRMDDOC=1 | 
|---|
| 66 | K ^TMP("PXRMDDOC",$J) | 
|---|
| 67 | ;Get each finding rule in sequence | 
|---|
| 68 | S SEQ="",INC=0,INST=0 | 
|---|
| 69 | F  S SEQ=$O(^PXRM(810.4,RULESET,30,"B",SEQ)) Q:'SEQ  D | 
|---|
| 70 | .;Save first sequence as default | 
|---|
| 71 | .I INC=0 S INC=1,FSEQ=SEQ | 
|---|
| 72 | .S SUB=$O(^PXRM(810.4,RULESET,30,"B",SEQ,"")) Q:'SUB | 
|---|
| 73 | .S RSDATA=$G(^PXRM(810.4,RULESET,30,SUB,0)) Q:RSDATA="" | 
|---|
| 74 | .S RSDATES=$G(^PXRM(810.4,RULESET,30,SUB,1)) | 
|---|
| 75 | .;Finding rule ien and action | 
|---|
| 76 | .S FRIEN=$P(RSDATA,U,2),FRACT=$P(RSDATA,U,3) Q:'FRIEN  Q:FRACT="" | 
|---|
| 77 | .;Check if entry is a finding rule (not a set or reminder rule) | 
|---|
| 78 | .S FRDATA=$G(^PXRM(810.4,FRIEN,0)),FRTYP=$P(FRDATA,U,3) Q:FRTYP=3 | 
|---|
| 79 | .S FRDATES=$P(FRDATA,U,4,5) | 
|---|
| 80 | .;Get term IEN for finding rule | 
|---|
| 81 | .I FRTYP=1 S FRTIEN=$P(FRDATA,U,7) Q:'FRTIEN | 
|---|
| 82 | .;Get Reminder definition IEN for Reminder rule | 
|---|
| 83 | .I FRTYP=2 S RRIEN=$P(FRDATA,U,10) Q:'RRIEN | 
|---|
| 84 | .;Get Extract Patient List name for patient list rule | 
|---|
| 85 | .I FRTYP=5 S FRLST=$P($G(^PXRM(810.4,FRIEN,1)),U) D  Q:FRLST="" | 
|---|
| 86 | ..I +EXTITR>0 S FRLST=FRLST_"/"_EXTITR | 
|---|
| 87 | ..S FROLST=$P(FRDATA,U,8) | 
|---|
| 88 | ..I +FROLST>0 S FRLST=$P($G(^PXRMXP(810.5,FROLST,0)),U) | 
|---|
| 89 | .;Determine RBDT and REDT | 
|---|
| 90 | .D RDATES^PXRMEUT1(RSDATES,FRDATES,LBBDT,LBEDT,.RBDT,.REDT) | 
|---|
| 91 | .S PXRMDATE=LBEDT | 
|---|
| 92 | .;Get start sequence or start patient list | 
|---|
| 93 | .S FRSTRT=$P(RSDATA,U,4),FRPAT=$P(RSDATA,U,5) | 
|---|
| 94 | .;If sequence is defined use it | 
|---|
| 95 | .I FRSTRT S FROUT=NODE_FRSTRT | 
|---|
| 96 | .;If neither exist use first as default | 
|---|
| 97 | .I FRSTRT="",FRPAT="" S FROUT=NODE_FSEQ | 
|---|
| 98 | .;If start is patient list load patient list into workfile | 
|---|
| 99 | .I FRSTRT="",FRPAT]"" S FROUT=NODE_SEQ D LOAD(FROUT,FRPAT) | 
|---|
| 100 | .;Name of permanent list | 
|---|
| 101 | .S FRPERM=$P(RSDATA,U,6) | 
|---|
| 102 | .; | 
|---|
| 103 | .;Build patient list in TMP | 
|---|
| 104 | .N DFN,PNODE,TLIST | 
|---|
| 105 | .S PNODE="PXRMEVAL" | 
|---|
| 106 | .K ^TMP($J,PNODE) | 
|---|
| 107 | .;Term finding rules | 
|---|
| 108 | .I FRTYP=1 D TERM^PXRMRUL1(FRACT,FRTIEN,LBBDT,LBEDT,RBDT,REDT,PNODE,.INST) | 
|---|
| 109 | .;Reminder Definition List Rule | 
|---|
| 110 | .I FRTYP=2 D REM^PXRMRUL1(FRACT,RRIEN,LBBDT,LBEDT,RBDT,REDT,PNODE) | 
|---|
| 111 | .;Patient list finding rules | 
|---|
| 112 | .I FRTYP=5 D PATS(FRACT,FROUT,PNODE,FRLST) | 
|---|
| 113 | .;Clear results file | 
|---|
| 114 | .K ^TMP($J,PNODE) | 
|---|
| 115 | .; | 
|---|
| 116 | .;Build permanent list if required | 
|---|
| 117 | .I FRPERM]"" D | 
|---|
| 118 | ..N FRPIEN | 
|---|
| 119 | ..;Get patient list IEN or create new patient list | 
|---|
| 120 | ..S FRPIEN=$$CRLST^PXRMRUL1(FRPERM,CLASS) Q:'FRPIEN | 
|---|
| 121 | ..;Update patient list | 
|---|
| 122 | ..D UPDLST(FROUT,FRPIEN,PAR,RULESET,INST,INDP,INTP) | 
|---|
| 123 | ; | 
|---|
| 124 | ;Save final results to patient list | 
|---|
| 125 | I LIST'="",FROUT'="" D | 
|---|
| 126 | . D RMPAT^PXRMEUT(FROUT,INDP,INTP) | 
|---|
| 127 | . D UPDLST(FROUT,LIST,PAR,RULESET,INST,INDP,INTP) | 
|---|
| 128 | .;PXRMDDOC=2 compare saved dates with those generated in | 
|---|
| 129 | .;DOCUMENT^PXRMEUT. | 
|---|
| 130 | . S PXRMDDOC=2 | 
|---|
| 131 | . D DOCUMENT^PXRMEUT(LIST,RULESET,INDP,INTP,LBBDT,LBEDT) | 
|---|
| 132 | K ^TMP("PXRMDDOC",$J) | 
|---|
| 133 | Q | 
|---|
| 134 | ; | 
|---|
| 135 | UPDLST(NODE,LIST,EPIEN,RULE,INST,INDP,INTP) ;Update patient list | 
|---|
| 136 | N CNT,DA,DATA,DCNT,DECEASED,DFN,DNAME,DNAMEL,DOD,DUE,DUOUT,FDA | 
|---|
| 137 | N INSTNAM,INSTNUM,LAST,MSG,NAME,ONODE | 
|---|
| 138 | N RCNT,RIEN,RNAMEL,RNCNT,SUB,TEMP,TEST,TYPE,VALUE | 
|---|
| 139 | ;Lock patient list | 
|---|
| 140 | D LOCK^PXRMRUL1 Q:$D(DUOUT) | 
|---|
| 141 | S TEMP=^PXRMXP(810.5,LIST,0) | 
|---|
| 142 | S NAME=$P(TEMP,U,1) | 
|---|
| 143 | S $P(^PXRMXP(810.5,LIST,0),U,11)=INDP | 
|---|
| 144 | S $P(^PXRMXP(810.5,LIST,0),U,12)=INTP | 
|---|
| 145 | ; | 
|---|
| 146 | ;Clear existing list. | 
|---|
| 147 | K ^PXRMXP(810.5,LIST,30),^PXRMXP(810.5,LIST,35),^PXRMXP(810.5,LIST,45),^PXRMXP(810.5,LIST,200) | 
|---|
| 148 | ; | 
|---|
| 149 | ;Merge ^TMP into Patient List | 
|---|
| 150 | S (DECEASED,TESTP)="" | 
|---|
| 151 | S (CNT,DFN)=0 | 
|---|
| 152 | F  S DFN=$O(^TMP($J,NODE,DFN)) Q:'DFN  D | 
|---|
| 153 | .S ONODE=$G(^TMP($J,NODE,DFN,"INST")) | 
|---|
| 154 | .S INSTNUM=$P(ONODE,U,1),INSTNAM=$P(ONODE,U,2) | 
|---|
| 155 | .S TEMP=DFN_U_INSTNUM_U_INSTNAM | 
|---|
| 156 | .I INDP D | 
|---|
| 157 | ..;DBIA #10035 | 
|---|
| 158 | ..S DOD=+$P($G(^DPT(DFN,.35)),U,1) | 
|---|
| 159 | ..S DECEASED=$S(DOD=0:0,1:1) | 
|---|
| 160 | .;DBIA #3744 | 
|---|
| 161 | .I INTP S TESTP=$$TESTPAT^VADPT(DFN) | 
|---|
| 162 | .S CNT=CNT+1,^PXRMXP(810.5,LIST,30,CNT,0)=DFN_U_INSTNUM_U_INSTNAM_U_DECEASED_U_TESTP | 
|---|
| 163 | .S ^PXRMXP(810.5,LIST,30,"B",DFN,CNT)="" | 
|---|
| 164 | .; | 
|---|
| 165 | .;Save the reminder evaluation information only from Reports | 
|---|
| 166 | .I $D(^TMP($J,NODE,DFN,"REM"))>0 D | 
|---|
| 167 | ..S (RIEN,RCNT,RNCNT)=0 | 
|---|
| 168 | ..F  S RIEN=$O(^TMP($J,NODE,DFN,"REM",RIEN)) Q:RIEN'>0  D | 
|---|
| 169 | ...S RNAMEL(RIEN)="" | 
|---|
| 170 | ...S VALUE=^TMP($J,NODE,DFN,"REM",RIEN) | 
|---|
| 171 | ...S RCNT=RCNT+1 | 
|---|
| 172 | ...S ^PXRMXP(810.5,LIST,30,CNT,"REM",RCNT,0)=VALUE | 
|---|
| 173 | ...S ^PXRMXP(810.5,LIST,30,CNT,"REM","B",RIEN,RCNT)="" | 
|---|
| 174 | ..S ^PXRMXP(810.5,LIST,30,CNT,1,0)=U_"810.532A"_U_RCNT_U_RCNT | 
|---|
| 175 | .; | 
|---|
| 176 | .I '$D(^TMP($J,NODE,DFN,"DATA")) Q | 
|---|
| 177 | .S DCNT=0,DNAME="" | 
|---|
| 178 | .F  S DNAME=$O(^TMP($J,NODE,DFN,"DATA",DNAME)) Q:DNAME=""  D | 
|---|
| 179 | ..S DNAMEL(DNAME)="" | 
|---|
| 180 | ..S VALUE=^TMP($J,NODE,DFN,"DATA",DNAME) | 
|---|
| 181 | ..S DCNT=DCNT+1 | 
|---|
| 182 | ..S ^PXRMXP(810.5,LIST,30,CNT,"DATA",DCNT,0)=DNAME_U_VALUE | 
|---|
| 183 | ..S ^PXRMXP(810.5,LIST,30,CNT,"DATA","B",DNAME,DCNT)="" | 
|---|
| 184 | .S ^PXRMXP(810.5,LIST,30,CNT,1,0)=U_"810.531A"_U_DCNT_U_DCNT | 
|---|
| 185 | S ^PXRMXP(810.5,LIST,30,0)=U_"810.53P"_U_CNT_U_CNT | 
|---|
| 186 | ; | 
|---|
| 187 | ;Save the reminder information | 
|---|
| 188 | S RNCNT=0,RIEN=0 | 
|---|
| 189 | F  S RIEN=$O(RNAMEL(RIEN)) Q:RIEN'>0  D | 
|---|
| 190 | .S RNCNT=RNCNT+1 | 
|---|
| 191 | .S ^PXRMXP(810.5,LIST,45,RCNT,0)=RIEN | 
|---|
| 192 | .S ^PXRMXP(810.5,LIST,45,"B",RIEN,RNCNT)="" | 
|---|
| 193 | I RNCNT>0 S ^PXRMXP(810.5,LIST,45,0)=U_"810.545P"_U_RNCNT_U_RNCNT | 
|---|
| 194 | ; | 
|---|
| 195 | ;Save the data types. | 
|---|
| 196 | S DCNT=0,DNAME="" | 
|---|
| 197 | F  S DNAME=$O(DNAMEL(DNAME)) Q:DNAME=""  D | 
|---|
| 198 | .S DCNT=DCNT+1 | 
|---|
| 199 | .S ^PXRMXP(810.5,LIST,35,DCNT,0)=DNAME | 
|---|
| 200 | .S ^PXRMXP(810.5,LIST,35,"B",DNAME,DCNT)="" | 
|---|
| 201 | I DCNT>0 S ^PXRMXP(810.5,LIST,35,0)=U_"810.535A"_U_DCNT_U_DCNT | 
|---|
| 202 | S ^PXRMXP(810.5,LIST,30,0)=U_"810.53P"_U_CNT_U_CNT | 
|---|
| 203 | ; | 
|---|
| 204 | ;Update header info | 
|---|
| 205 | S TYPE=$S($G(PATCREAT)="Y":"PVT",1:"PUB") | 
|---|
| 206 | K PATCREAT | 
|---|
| 207 | S FDA(810.5,"?+1,",.01)=NAME | 
|---|
| 208 | S FDA(810.5,"?+1,",.04)=$$NOW^XLFDT | 
|---|
| 209 | S FDA(810.5,"?+1,",.05)=EPIEN | 
|---|
| 210 | S FDA(810.5,"?+1,",.06)=RULE | 
|---|
| 211 | S FDA(810.5,"?+1,",.07)=$G(DUZ) | 
|---|
| 212 | S FDA(810.5,"?+1,",.08)=TYPE | 
|---|
| 213 | I $G(INST)=1 S FDA(810.5,"?+1,",.1)=1 | 
|---|
| 214 | S FDA(810.5,"?+1,",50)=$S($G(PLISTPUG)="Y":1,1:0) | 
|---|
| 215 | D UPDATE^DIE("","FDA","","MSG") | 
|---|
| 216 | ;Error | 
|---|
| 217 | I $D(MSG) D ERR^PXRMRUL1 | 
|---|
| 218 | ;Unlock patient list | 
|---|
| 219 | D UNLOCK^PXRMRUL1 | 
|---|
| 220 | Q | 
|---|
| 221 | ; | 
|---|