| 1 | PXRMEUT ; SLC/PJH - General extract utilities ;09/06/2007
 | 
|---|
| 2 |  ;;2.0;CLINICAL REMINDERS;**4,6**;Feb 04, 2005;Build 123
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 |  ;=================================================
 | 
|---|
| 5 | ASKNUM(TEXT,MIN,MAX) ;
 | 
|---|
| 6 |  N DIR,X,Y
 | 
|---|
| 7 |  K DIROUT,DIRUT,DTOUT,DUOUT
 | 
|---|
| 8 |  S DIR(0)="N"_U_MIN_":"_MAX
 | 
|---|
| 9 |  S DIR("A")=TEXT
 | 
|---|
| 10 |  S DIR("B")=MIN
 | 
|---|
| 11 |  S DIR("?")="Enter a number between "_MIN_" and "_MAX_"."
 | 
|---|
| 12 |  W !
 | 
|---|
| 13 |  D ^DIR
 | 
|---|
| 14 |  I $D(DTOUT)!$D(DUOUT) S Y=MIN
 | 
|---|
| 15 |  Q Y
 | 
|---|
| 16 |  ;
 | 
|---|
| 17 |  ;=================================================
 | 
|---|
| 18 | ASKYN(DEF,TEXT,RTN,HLP) ;
 | 
|---|
| 19 |  N DIR,X,Y
 | 
|---|
| 20 |  K DIROUT,DIRUT,DTOUT,DUOUT
 | 
|---|
| 21 |  S DIR(0)="Y0"
 | 
|---|
| 22 |  S DIR("A")=TEXT
 | 
|---|
| 23 |  S DIR("B")=DEF
 | 
|---|
| 24 |  S DIR("?")="Enter Y or N."
 | 
|---|
| 25 |  I $G(RTN)'="",$G(HLP)'="" D
 | 
|---|
| 26 |  . S DIR("?")="Enter Y or N. For detailed help type ??"
 | 
|---|
| 27 |  . S DIR("??")=U_"D HELP^"_RTN_"(HLP)"
 | 
|---|
| 28 |  W !
 | 
|---|
| 29 |  D ^DIR
 | 
|---|
| 30 |  I $D(DTOUT)!$D(DUOUT) S Y=DEF
 | 
|---|
| 31 |  Q Y
 | 
|---|
| 32 |  ;
 | 
|---|
| 33 |  ;=================================================
 | 
|---|
| 34 | BHELP ;Write the beginning date help.
 | 
|---|
| 35 |  N BDHTEXT,%DT
 | 
|---|
| 36 |  S BDHTEXT(1)="This is the beginning date for the "_LIT_"."
 | 
|---|
| 37 |  D HELP^PXRMEUT(.BDHTEXT)
 | 
|---|
| 38 |  S %DT="P",%DT(0)=-DT
 | 
|---|
| 39 |  D HELP^%DTC
 | 
|---|
| 40 |  Q
 | 
|---|
| 41 |  ;
 | 
|---|
| 42 |  ;=================================================
 | 
|---|
| 43 | CALC(NEXT,START,END) ;Calculate period start and end dates
 | 
|---|
| 44 |  ;Next is current run period
 | 
|---|
| 45 |  N CMON,CYR,ETYPE,NMON,NYR,PERIOD,YEAR
 | 
|---|
| 46 |  ;extract year and period (M1,M2,Q1,Q2,Y etc)
 | 
|---|
| 47 |  I NEXT["/" S YEAR=$P(NEXT,"/",2),PERIOD=$P(NEXT,"/"),ETYPE=$E(PERIOD)
 | 
|---|
| 48 |  I NEXT?4N S YEAR=NEXT,PERIOD="",ETYPE="Y"
 | 
|---|
| 49 |  ;Two digit year
 | 
|---|
| 50 |  S CYR=$E(YEAR,3,4),NYR=CYR
 | 
|---|
| 51 |  ;If yearly use Jan 1st of current year and next
 | 
|---|
| 52 |  I ETYPE="Y" D
 | 
|---|
| 53 |  .S CMON="1",NMON="1",NYR=NYR+1
 | 
|---|
| 54 |  ;If quarterly use start of first month of next quarter
 | 
|---|
| 55 |  I ETYPE="Q" D
 | 
|---|
| 56 |  .S CMON=$E(PERIOD,2,99),NMON=CMON*3+1 I NMON>12 S NYR=NYR+1,NMON=1
 | 
|---|
| 57 |  .S CMON=CMON*3-2
 | 
|---|
| 58 |  ;If monthly use start of next month
 | 
|---|
| 59 |  I ETYPE="M" D
 | 
|---|
| 60 |  .S CMON=$E(PERIOD,2,99),NMON=CMON+1 I NMON>12 S NYR=NYR+1,NMON=1
 | 
|---|
| 61 |  ;Zero fill the month fields
 | 
|---|
| 62 |  S CMON=$$RJ^XLFSTR(CMON,2,0),NMON=$$RJ^XLFSTR(NMON,2,0)
 | 
|---|
| 63 |  ;Zero fill the year fields
 | 
|---|
| 64 |  S CYR=$$RJ^XLFSTR(CYR,2,0),NYR=$$RJ^XLFSTR(NYR,2,0)
 | 
|---|
| 65 |  ;Report start date is start of current period 
 | 
|---|
| 66 |  S START=3_CYR_CMON_"01"
 | 
|---|
| 67 |  ;Report end date is start of next period less one day
 | 
|---|
| 68 |  S END=$$FMADD^XLFDT(3_NYR_NMON_"01",-1)
 | 
|---|
| 69 |  Q
 | 
|---|
| 70 |  ;
 | 
|---|
| 71 |  ;=================================================
 | 
|---|
| 72 | DATES(BDATE,EDATE,LIT) ;Get a past date range.
 | 
|---|
| 73 | BEGIN ;Select the beginning date.
 | 
|---|
| 74 |  N DIR,%DT,X,Y
 | 
|---|
| 75 |  K DIROUT,DIRUT,DTOUT,DUOUT
 | 
|---|
| 76 |  S DIR(0)="DA^::ETX"
 | 
|---|
| 77 |  S DIR("A")="Enter "_LIT_" BEGINNING DATE: "
 | 
|---|
| 78 |  S DIR("PRE")="S X=$$DCHECK^PXRMDATE(X) K:X=-1 X"
 | 
|---|
| 79 |  S DIR("?")="For detailed help type ??"
 | 
|---|
| 80 |  S DIR("??")=U_"D BHELP^PXRMEUT"
 | 
|---|
| 81 |  W !
 | 
|---|
| 82 |  D ^DIR K DIR
 | 
|---|
| 83 |  I $D(DIROUT) S DTOUT=1
 | 
|---|
| 84 |  I $D(DTOUT)!($D(DUOUT)) Q
 | 
|---|
| 85 |  S BDATE=Y
 | 
|---|
| 86 |  I $E(Y,6,7)="00" W $C(7),"  ?? Enter exact date" G BEGIN
 | 
|---|
| 87 |  S BDATE=Y
 | 
|---|
| 88 |  ;
 | 
|---|
| 89 | END ;Select the ending date.
 | 
|---|
| 90 |  S DIR(0)="DA^"_BDATE_"::ETX"
 | 
|---|
| 91 |  S DIR("A")="Enter "_LIT_" ENDING DATE: "
 | 
|---|
| 92 |  S DIR("PRE")="S X=$$DCHECK^PXRMDATE(X) K:X=-1 X"
 | 
|---|
| 93 |  S DIR("?")="This date cannot be before "_$$FMTE^XLFDT(BDATE,"D")_". For detailed help type ??"
 | 
|---|
| 94 |  S DIR("??")=U_"D EHELP^PXRMEUT"
 | 
|---|
| 95 |  D ^DIR
 | 
|---|
| 96 |  I $D(DIROUT) S DTOUT=1
 | 
|---|
| 97 |  I $D(DTOUT) Q
 | 
|---|
| 98 |  I $D(DUOUT) G BEGIN
 | 
|---|
| 99 |  S EDATE=Y
 | 
|---|
| 100 |  I $E(Y,6,7)="00" W $C(7),"  ?? Enter exact date" G END
 | 
|---|
| 101 |  K DIROUT,DIRUT,DTOUT,DUOUT
 | 
|---|
| 102 |  Q
 | 
|---|
| 103 |  ;
 | 
|---|
| 104 |  ;=================================================
 | 
|---|
| 105 | DOCUMENT(PXRMLIST,PXRMRULE,INDP,INTP,BEG,END) ;Document how the
 | 
|---|
| 106 |  ;list was built.
 | 
|---|
| 107 |  N CDATE,CLASS,CREATOR,IND,LDATA,LNAME
 | 
|---|
| 108 |  N NDL,NL,NPAT,OUTPUT,SNAME,SOURCE,TEXT,TYPE,VALMCNT
 | 
|---|
| 109 |  K ^TMP("PXRMLRED",$J)
 | 
|---|
| 110 |  S LDATA=$G(^PXRMXP(810.5,PXRMLIST,0))
 | 
|---|
| 111 |  S LNAME=$P(LDATA,U,1)
 | 
|---|
| 112 |  S CDATE=$P(LDATA,U,4)
 | 
|---|
| 113 |  S SOURCE=$P(LDATA,U,5),SNAME="NONE"
 | 
|---|
| 114 |  ;Check if generated from #810.2
 | 
|---|
| 115 |  I SOURCE S SNAME="Extract Parameter - "_$P($G(^PXRM(810.2,SOURCE,0)),U)
 | 
|---|
| 116 |  ;If not check if generated from #810.4
 | 
|---|
| 117 |  I 'SOURCE S SOURCE=$P(LDATA,U,6) S:SOURCE SNAME="List Rule - "_$P($G(^PXRM(810.4,SOURCE,0)),U)
 | 
|---|
| 118 |  ;Creator
 | 
|---|
| 119 |  S CREATOR=+$P(LDATA,U,7)
 | 
|---|
| 120 |  S CREATOR=$S(CREATOR>0:$$GET1^DIQ(200,CREATOR,.01),1:"None")
 | 
|---|
| 121 |  ;Type
 | 
|---|
| 122 |  S TYPE=$P(LDATA,U,8)
 | 
|---|
| 123 |  S TYPE=$$EXTERNAL^DILFD(810.5,.08,"",TYPE,.EM)
 | 
|---|
| 124 |  ;Class
 | 
|---|
| 125 |  S CLASS=$P($G(^PXRMXP(810.5,PXRMLIST,100)),U,1)
 | 
|---|
| 126 |  S CLASS=$S(CLASS="N":"National",CLASS="V":"VISN",1:"Local")
 | 
|---|
| 127 |  S NPAT=$P(^PXRMXP(810.5,PXRMLIST,30,0),U,4)
 | 
|---|
| 128 |  S TEXT(1)="List Name: "_LNAME_" ("_NPAT_" patients)"
 | 
|---|
| 129 |  S TEXT(2)=" Created: "_$$FMTE^XLFDT(CDATE,"5Z")
 | 
|---|
| 130 |  S TEXT(2)=$$LJ^XLFSTR(TEXT(2),40)_"Creator: "_CREATOR
 | 
|---|
| 131 |  S TEXT(3)=" Class: "_CLASS
 | 
|---|
| 132 |  S TEXT(3)=$$LJ^XLFSTR(TEXT(3),40)_"Type: "_TYPE
 | 
|---|
| 133 |  S TEXT(4)=" Source: "_SNAME
 | 
|---|
| 134 |  S TEXT(5)=" Patient List Beginning Date: "_$$FMTE^XLFDT(BEG,"5Z")
 | 
|---|
| 135 |  S TEXT(6)=" Patient List Ending Date: "_$$FMTE^XLFDT(END,"5Z")
 | 
|---|
| 136 |  S TEXT(7)=" "
 | 
|---|
| 137 |  S NL=7
 | 
|---|
| 138 |  F IND=1:1:NL S ^PXRMXP(810.5,PXRMLIST,200,IND,0)=TEXT(IND)
 | 
|---|
| 139 |  D BLDLIST^PXRMLRED(PXRMRULE,3)
 | 
|---|
| 140 |  F IND=1:1:VALMCNT S NL=NL+1,^PXRMXP(810.5,PXRMLIST,200,NL,0)=^TMP("PXRMLRED",$J,IND,0)
 | 
|---|
| 141 |  S NL=NL+1,^PXRMXP(810.5,PXRMLIST,200,NL,0)=" --- List Build Information ---"
 | 
|---|
| 142 |  S NL=NL+1,^PXRMXP(810.5,PXRMLIST,200,NL,0)="List Build Beginning Date: "_$$FMTE^XLFDT(BEG,"5Z")
 | 
|---|
| 143 |  S NL=NL+1,^PXRMXP(810.5,PXRMLIST,200,NL,0)="List Build Ending Date: "_$$FMTE^XLFDT(END,"5Z")
 | 
|---|
| 144 |  S NL=NL+1,^PXRMXP(810.5,PXRMLIST,200,NL,0)=" "
 | 
|---|
| 145 |  S NL=NL+1,^PXRMXP(810.5,PXRMLIST,200,NL,0)="Include deceased patients: "_$S(INDP:"Yes",1:"No")
 | 
|---|
| 146 |  S NL=NL+1,^PXRMXP(810.5,PXRMLIST,200,NL,0)="Include test patients: "_$S(INTP:"Yes",1:"No")
 | 
|---|
| 147 |  ;Get the beginning and ending date information
 | 
|---|
| 148 |  D DOCDATES^PXRMEUT1(PXRMRULE,BEG,END,.NDL,.OUTPUT)
 | 
|---|
| 149 |  F IND=1:1:NDL S NL=NL+1,^PXRMXP(810.5,PXRMLIST,200,NL,0)=OUTPUT(IND)
 | 
|---|
| 150 |  S ^PXRMXP(810.5,PXRMLIST,200,0)=U_U_NL_U_NL_U_DT_U
 | 
|---|
| 151 |  K ^TMP("PXRMLRED",$J)
 | 
|---|
| 152 |  Q
 | 
|---|
| 153 |  ;
 | 
|---|
| 154 |  ;=================================================
 | 
|---|
| 155 | EHELP ;Write the ending date help.
 | 
|---|
| 156 |  N EDHTEXT,%DT
 | 
|---|
| 157 |  S EDHTEXT(1)="This is the ending date for the "_LIT_"."
 | 
|---|
| 158 |  D HELP^PXRMEUT(.EDHTEXT)
 | 
|---|
| 159 |  S %DT="P",%DT(0)=-DT
 | 
|---|
| 160 |  D HELP^%DTC
 | 
|---|
| 161 |  Q
 | 
|---|
| 162 |  ;
 | 
|---|
| 163 |  ;=================================================
 | 
|---|
| 164 | HELP(HTEXT) ;General help text output routine.
 | 
|---|
| 165 |  N IND,NIN,NOUT,TEXTIN,TEXOUT
 | 
|---|
| 166 |  ;Make sure the text is in a form the formatting routine can handle.
 | 
|---|
| 167 |  S IND="",NIN=0
 | 
|---|
| 168 |  F  S IND=$O(HTEXT(IND)) Q:IND=""  S NIN=NIN+1,TEXTIN(NIN)=HTEXT(IND)
 | 
|---|
| 169 |  D FORMAT^PXRMTEXT(1,72,NIN,.TEXTIN,.NOUT,.TEXTOUT)
 | 
|---|
| 170 |  F IND=1:1:NOUT W !,TEXTOUT(IND)
 | 
|---|
| 171 |  W !
 | 
|---|
| 172 |  Q
 | 
|---|
| 173 |  ;
 | 
|---|
| 174 |  ;=================================================
 | 
|---|
| 175 | LDELOK(LISTIEN) ;Return a 1 if it is ok for this user to delete the list.
 | 
|---|
| 176 |  N CREATOR,DELOK
 | 
|---|
| 177 |  S CREATOR=$P(^PXRMXP(810.5,LISTIEN,0),U,7)
 | 
|---|
| 178 |  S DELOK=$S(CREATOR=DUZ:1,$D(^XUSEC("PXRM MANAGER",DUZ)):1,1:0)
 | 
|---|
| 179 |  Q DELOK
 | 
|---|
| 180 |  ;
 | 
|---|
| 181 |  ;=================================================
 | 
|---|
| 182 | MES(TEXT) ;General mail message
 | 
|---|
| 183 |  N XMSUB
 | 
|---|
| 184 |  K ^TMP("PXRMXMZ",$J)
 | 
|---|
| 185 |  S XMSUB="CLINICAL REMINDER EXTRACT"
 | 
|---|
| 186 |  S ^TMP("PXRMXMZ",$J,1,0)=TEXT
 | 
|---|
| 187 |  D SEND^PXRMMSG(XMSUB)
 | 
|---|
| 188 |  Q
 | 
|---|
| 189 |  ;
 | 
|---|
| 190 |  ;=================================================
 | 
|---|
| 191 | PERIOD(FREQ) ;Calculate next period
 | 
|---|
| 192 |  N CMON,CUR,CYR,ETYPE,NEXT,PERIOD,YEAR
 | 
|---|
| 193 |  ;Format current date YY/MM/DD
 | 
|---|
| 194 |  S CUR=$$FMTE^XLFDT($$NOW^XLFDT,7)
 | 
|---|
| 195 |  ;extract year and period
 | 
|---|
| 196 |  S YEAR=$P(CUR,"/"),PERIOD=$P(CUR,"/",2)
 | 
|---|
| 197 |  ;If yearly current year
 | 
|---|
| 198 |  I FREQ="Y" D
 | 
|---|
| 199 |  .S NEXT=YEAR
 | 
|---|
| 200 |  ;If quarterly use current quarter
 | 
|---|
| 201 |  I FREQ="Q" D
 | 
|---|
| 202 |  .S NEXT="Q"_((PERIOD-1\3)+1)_"/"_YEAR
 | 
|---|
| 203 |  ;If monthly use current month
 | 
|---|
| 204 |  I FREQ="M" D
 | 
|---|
| 205 |  .S NEXT="M"_PERIOD_"/"_YEAR
 | 
|---|
| 206 |  Q NEXT
 | 
|---|
| 207 |  ;
 | 
|---|
| 208 |  ;=================================================
 | 
|---|
| 209 | RMPAT(NODE,INDP,INTP) ;Remove dead and test patients from
 | 
|---|
| 210 |  ;the list.
 | 
|---|
| 211 |  I INDP,INTP Q
 | 
|---|
| 212 |  N DFN,DOD,REMOVE
 | 
|---|
| 213 |  S DFN=0
 | 
|---|
| 214 |  F  S DFN=$O(^TMP($J,NODE,DFN)) Q:DFN=""  D
 | 
|---|
| 215 |  .;DBIA 3744
 | 
|---|
| 216 |  . S REMOVE=$S('INTP:$$TESTPAT^VADPT(DFN),1:0)
 | 
|---|
| 217 |  . I REMOVE K ^TMP($J,NODE,DFN) Q
 | 
|---|
| 218 |  . I INDP Q
 | 
|---|
| 219 |  .;DBIA #10035
 | 
|---|
| 220 |  . S DOD=+$P($G(^DPT(DFN,.35)),U,1)
 | 
|---|
| 221 |  . I DOD=0 Q
 | 
|---|
| 222 |  . K ^TMP($J,NODE,DFN)
 | 
|---|
| 223 |  Q
 | 
|---|
| 224 |  ;
 | 
|---|