[613] | 1 | PRSPSAPU ;WOIFO/JAH - PT Physician, supervisor approval utils ;01/22/05
|
---|
| 2 | ;;4.0;PAID;**93**;Sep 21, 1995;Build 7
|
---|
| 3 | ;;Per VHA Directive 2004-038, this routine should not be modified.
|
---|
| 4 | Q
|
---|
| 5 | ONEPTP(TLE) ; get one or all ptp's from a TLE
|
---|
| 6 | ; if the selection hasn't a memo or hasn't an ESR to be approved
|
---|
| 7 | ; then inform and re-ask
|
---|
| 8 | ;
|
---|
| 9 | ; return PRSIEN for successful PTP selection
|
---|
| 10 | ; return 0 for all PTP's in T&L
|
---|
| 11 | ; return -1 for abort/timeout
|
---|
| 12 | ;
|
---|
| 13 | N ALL,PTP,OUT
|
---|
| 14 | S (PTP,ALL,OUT)=0
|
---|
| 15 | F D Q:(OUT!(PTP>0)!(ALL))
|
---|
| 16 | . S PTP=$$ALL1PTP(TLE)
|
---|
| 17 | . I PTP=0 S ALL=1 Q ; all ptp's were selected
|
---|
| 18 | . I PTP<0 S OUT=1 Q ; user uparrow or timeout
|
---|
| 19 | . I PTP>0,'$D(^PRST(458.7,"B",PTP)) W !!,"There are no Service Level Memoranda on file for ",$P(^PRSPC(PTP,0),U) S PTP=0
|
---|
| 20 | . I PTP>0,'$D(^PRST(458,"ASA",PTP)) W !!,"There are no daily ESR's pending approval for ",$P(^PRSPC(PTP,0),U) S PTP=0
|
---|
| 21 | I ALL S PTP=0
|
---|
| 22 | I OUT S PTP=-1
|
---|
| 23 | Q PTP
|
---|
| 24 | ;
|
---|
| 25 | ALL1PTP(TLE) ; ask for one part time physician from a TLE or ALL
|
---|
| 26 | Q:TLE'>0
|
---|
| 27 | N DIC,PRSIEN,D,Y,DUOUT,DTOUT
|
---|
| 28 | S PRSIEN=""
|
---|
| 29 | S DIC("A")="Select an EMPLOYEE or press RETURN for ALL: "
|
---|
| 30 | S DIC(0)="AEQM"
|
---|
| 31 | S DIC="^PRSPC("
|
---|
| 32 | S DIC("S")="I $P(^(0),""^"",8)=TLE"
|
---|
| 33 | ; start look up with ATL xref
|
---|
| 34 | S D="ATL"_TLE
|
---|
| 35 | W !
|
---|
| 36 | D IX^DIC
|
---|
| 37 | ;
|
---|
| 38 | ; user hit return for all (return 0)
|
---|
| 39 | I Y=-1,'($D(DUOUT)!$D(DTOUT)) D
|
---|
| 40 | . S PRSIEN=0
|
---|
| 41 | E D
|
---|
| 42 | . S PRSIEN=+Y
|
---|
| 43 | Q PRSIEN
|
---|
| 44 | ;
|
---|
| 45 | UPESRST(PPI,PRSIEN,PRSD) ;update ESR DAILY STATUS
|
---|
| 46 | N DIE,DR,DA
|
---|
| 47 | S DA(2)=$G(PPI),DA(1)=$G(PRSIEN),DA=$G(PRSD)
|
---|
| 48 | S DR="146///SIGNED;149///MANUAL POST"
|
---|
| 49 | S DIE="^PRST(458,"_DA(2)_",""E"","_DA(1)_",""D"","
|
---|
| 50 | D ^DIE
|
---|
| 51 | Q
|
---|
| 52 | ESRDTS(ESRDTS,PRSIEN,PPI) ; Return signed dates from PTP's ESR
|
---|
| 53 | ; return array ESRDTS subscripted sequentially from 1
|
---|
| 54 | ; ESRDTS(1) = Tue 2-NOV-04
|
---|
| 55 | ; ESRDTS(2) = Fri 5-NOV-04
|
---|
| 56 | N PRSD,ITEMS,PRSDTS
|
---|
| 57 | S PRSDTS=$G(^PRST(458,PPI,2))
|
---|
| 58 | S (PRSD,ITEMS)=0
|
---|
| 59 | F S PRSD=$O(^TMP($J,"PRSPSAP",PRSIEN,PPI,PRSD)) Q:PRSD'>0 D
|
---|
| 60 | . S ITEMS=ITEMS+1
|
---|
| 61 | . S ESRDTS(ITEMS)=PRSD_U_$P(PRSDTS,U,PRSD)
|
---|
| 62 | Q
|
---|
| 63 | DISPLAY(PRSIEN,PPI,CNT) ;display PPI signed esr days for super review/action
|
---|
| 64 | ; RETURN array CNT
|
---|
| 65 | ; CNT = count of days
|
---|
| 66 | ; CNT(1)= days w/status from supervisor during this option
|
---|
| 67 | ; PGLNS = lines on current page
|
---|
| 68 | ; DYLNS = lines in a day
|
---|
| 69 | ;
|
---|
| 70 | N I,PRSD,ESRDTS,ESEG,ESR,PGLNS,DAYLNS,OUT
|
---|
| 71 | D HDRESR^PRSPSAP1(PRSIEN,PPI,.PGLNS)
|
---|
| 72 | ;
|
---|
| 73 | D ESRDTS^PRSPSAPU(.ESRDTS,PRSIEN,PPI)
|
---|
| 74 | S (PRSD,CNT,CNT(1),OUT)=0
|
---|
| 75 | F S PRSD=$O(^TMP($J,"PRSPSAP",PRSIEN,PPI,PRSD)) Q:PRSD'>0!(OUT) D
|
---|
| 76 | . I $Y>(IOSL-6) S OUT=$$ASK^PRSLIB00() D HDRESR^PRSPSAP1(PRSIEN,PPI,.PGLNS)
|
---|
| 77 | . Q:OUT
|
---|
| 78 | . D GETESR^PRSPSAP1(.ESR,PPI,PRSIEN,PRSD)
|
---|
| 79 | . S CNT=CNT+1
|
---|
| 80 | . W !,CNT
|
---|
| 81 | . D DAY(.DAYLNS,ESRDTS(CNT),.ESR,PRSIEN,PPI)
|
---|
| 82 | . S PGLNS=PGLNS+DAYLNS
|
---|
| 83 | Q
|
---|
| 84 | ;
|
---|
| 85 | DAY(LN,EXTDAY,ESR,PRSIEN,PPI) ; write a day, return # of lines.
|
---|
| 86 | N STE,ESEG,REMARKS,START,STOP,MEAL,HOURS,STATUSI,LCNT
|
---|
| 87 | S LN=0
|
---|
| 88 | S HOURS=""
|
---|
| 89 | W ?3,$P(EXTDAY,U,2)
|
---|
| 90 | W ?17,ESR("TODEXT")
|
---|
| 91 | ; if tour is too wide for column move down a line
|
---|
| 92 | I $L(ESR("TODEXT"))>16 W ! S LN=LN+1
|
---|
| 93 | ;
|
---|
| 94 | F ESEG=1:5:31 Q:($P(ESR("WORK"),U,ESEG)="") D
|
---|
| 95 | . I ESEG>1 W !
|
---|
| 96 | .; start
|
---|
| 97 | . S START=$P(ESR("WORK"),U,ESEG)
|
---|
| 98 | . S STOP=$P(ESR("WORK"),U,ESEG+1)
|
---|
| 99 | . S MEAL=$P(ESR("WORK"),U,ESEG+4)
|
---|
| 100 | . W ?33,START
|
---|
| 101 | . I START'["No work:" D
|
---|
| 102 | .. W "-"
|
---|
| 103 | .. S HOURS=$$ELAPSE^PRSPESR2(MEAL,START,STOP)
|
---|
| 104 | .; stop
|
---|
| 105 | . W STOP
|
---|
| 106 | .; type of time
|
---|
| 107 | . W ?49,$$TTE($P(ESR("WORK"),U,ESEG+2))
|
---|
| 108 | .; remarks - use 458.02 to convert to external
|
---|
| 109 | . S REMARKS=$P(ESR("WORK"),U,ESEG+3)
|
---|
| 110 | . I REMARKS>0 D
|
---|
| 111 | .. S LN=LN+1
|
---|
| 112 | .. W !,?34,"Remarks: ",$$EXTERNAL^DILFD(458.02,44,"",REMARKS)
|
---|
| 113 | .; hours and meal
|
---|
| 114 | . W ?61,HOURS,?68,MEAL
|
---|
| 115 | ; display PTP remarks (if any)
|
---|
| 116 | I ESR("RMK")]"" D
|
---|
| 117 | . W !,?2,"Physician Remarks: "
|
---|
| 118 | . D WRAP(.LCNT,ESR("RMK"),21,66)
|
---|
| 119 | . S LN=LN+LCNT
|
---|
| 120 | S STATUSI=$G(^TMP($J,"PRSPSAP",PRSIEN,PPI,+EXTDAY,1))
|
---|
| 121 | W ?72,$$STATUSE(STATUSI)
|
---|
| 122 | Q
|
---|
| 123 | GETDAY(ESRDY,ESRDTS,ESR,CNT,PRSIEN,PPI) ; RETURN write a day IN ESRDY ARRAY
|
---|
| 124 | N BLANKS,LN,ESEG,START
|
---|
| 125 | S LN=1
|
---|
| 126 | S BLANKS=" "
|
---|
| 127 | S ESRDY(LN)=" "_$P(ESRDTS(CNT),U,2)
|
---|
| 128 | S ESRDY(LN)=$E(ESRDY(LN)_BLANKS,1,18)_ESR("TODEXT")
|
---|
| 129 | ; if tour is too wide for the column move down a line for the work
|
---|
| 130 | I $L(ESR("TODEXT"))>16 S LN=LN+1,ESRDY(LN)=""
|
---|
| 131 | ;
|
---|
| 132 | F ESEG=1:5:31 Q:($P(ESR("WORK"),U,ESEG)="") D
|
---|
| 133 | . I ESEG>1 W !
|
---|
| 134 | .; start
|
---|
| 135 | . S START=$P(ESR("WORK"),U,ESEG)
|
---|
| 136 | . S ESRDY(LN)=$E(ESRDY(LN)_BLANKS,1,35)_START
|
---|
| 137 | . I START'["No work-signed by" S ESRDY(LN)=ESRDY(LN)_"-"
|
---|
| 138 | .; stop
|
---|
| 139 | . S ESRDY(LN)=ESRDY(LN)_$P(ESR("WORK"),U,ESEG+1)
|
---|
| 140 | .; type of time
|
---|
| 141 | . S ESRDY(LN)=$E(ESRDY(LN)_BLANKS,1,51)_$$TTE($P(ESR("WORK"),U,ESEG+2))
|
---|
| 142 | .; remarks
|
---|
| 143 | . S ESRDY(LN)=$E(ESRDY(LN)_BLANKS,1,54)_$P(ESR("WORK"),U,ESEG+3)
|
---|
| 144 | .; meal
|
---|
| 145 | . S ESRDY(LN)=$E(ESRDY(LN)_BLANKS,1,68)_$P(ESR("WORK"),U,ESEG+4)
|
---|
| 146 | . S ST=$$STATUSE($G(^TMP($J,"PRSPSAP",PRSIEN,PPI,+ESRDTS(CNT),1)))
|
---|
| 147 | . S ESRDY(LN)=$E(ESRDY(LN),1,71)_ST
|
---|
| 148 | . S LN=LN+1,ESRDY(LN)=""
|
---|
| 149 | Q
|
---|
| 150 | ;
|
---|
| 151 | TTE(CODE) ; return external type of time
|
---|
| 152 | N K
|
---|
| 153 | Q:$G(CODE)="" CODE
|
---|
| 154 | S K=$O(^PRST(457.3,"B",CODE,0))
|
---|
| 155 | Q $P($G(^PRST(457.3,+K,0)),"^",2)
|
---|
| 156 | ;
|
---|
| 157 | STATUSE(ST) ; return external form of supervisor action status
|
---|
| 158 | S ST=$G(ST)
|
---|
| 159 | Q $S(ST="B":"Bypass",ST="R":"Resubmit",ST="A":"Approved",1:"")
|
---|
| 160 | ;
|
---|
| 161 | CLRTCDY(PPI,PRSIEN,PRSD,EST) ;function true (1) for success otherwise 0
|
---|
| 162 | ; clear a timecard day (2,3,10 nodes) if status is (T) timekeeper
|
---|
| 163 | ; clear work, posting status and remove approved status from ESR day.
|
---|
| 164 | ; INPUT: PPI,PRSIEN,PRSD: package standard
|
---|
| 165 | ; EST : optional, valid ESR DAILY STATUS internal value
|
---|
| 166 | ;
|
---|
| 167 | Q:($G(PPI)'>0)!($G(PRSIEN)'>0)!($G(PRSD)'>0) 0
|
---|
| 168 | Q:'$D(^PRST(458,PPI,"E",PRSIEN,"D",PRSD,0)) 0
|
---|
| 169 | N TCSTAT
|
---|
| 170 | S TCSTAT=$$TCSTAT^PRSPSAP2(PPI,PRSIEN)
|
---|
| 171 | Q:$G(TCSTAT)'="T" 0
|
---|
| 172 | ;
|
---|
| 173 | ; kill the timecard work nodes
|
---|
| 174 | K ^PRST(458,PPI,"E",PRSIEN,"D",PRSD,2),^(3),^(10)
|
---|
| 175 | ;
|
---|
| 176 | ; ONLY if a valid ESR daily status is passed then set it
|
---|
| 177 | N VALID
|
---|
| 178 | D CHK^DIE(458.02,146,"",$G(EST),.VALID)
|
---|
| 179 | Q:VALID["^" 1
|
---|
| 180 | ;
|
---|
| 181 | N IENS,PRSFDA
|
---|
| 182 | S IENS=PRSD_","_PRSIEN_","_PPI_","
|
---|
| 183 | S PRSFDA(458.02,IENS,146)=EST
|
---|
| 184 | D FILE^DIE("","PRSFDA")
|
---|
| 185 | D MSG^DIALOG()
|
---|
| 186 | Q 1
|
---|
| 187 | ;
|
---|
| 188 | WRAP(LNS,STR,TAB,WID) ; format a long message string to break lines at words
|
---|
| 189 | ; TAB is left margin
|
---|
| 190 | ; WID is right margin
|
---|
| 191 | ; return LNS number of lines it took to write
|
---|
| 192 | N WORD,I,WC,COLW,W1,W2
|
---|
| 193 | S WC=0,WORD=""
|
---|
| 194 | S COLW=WID-TAB+1
|
---|
| 195 | W ?$G(TAB)
|
---|
| 196 | S LNS=1
|
---|
| 197 | F I=1:1:$L(STR," ") D
|
---|
| 198 | . S WORD=$P(STR," ",I)
|
---|
| 199 | . Q:WORD=""
|
---|
| 200 | .; break words longer than the width of the column
|
---|
| 201 | . F Q:($L(WORD)<(COLW+1)) D
|
---|
| 202 | .. S W1=$E(WORD,1,COLW-1)_"-"
|
---|
| 203 | .. S W2=$E(WORD,COLW,$L(WORD))
|
---|
| 204 | .. S WORD=W1 D WW
|
---|
| 205 | .. S WORD=W2
|
---|
| 206 | . D WW
|
---|
| 207 | Q
|
---|
| 208 | WW ; Write Word
|
---|
| 209 | I ($X+$L(WORD))>WID D
|
---|
| 210 | . I WC>0 W !,?$G(TAB) S LNS=LNS+1,WC=0
|
---|
| 211 | W WORD," " S WC=WC+1
|
---|
| 212 | Q
|
---|
| 213 | ;
|
---|
| 214 | ;
|
---|
| 215 | ;===============================================================
|
---|
| 216 | ;
|
---|
| 217 | AMT(START,STOP,MEAL) ; return decimal hours between times
|
---|
| 218 | ; times are in PAID timecard work node format. (e.g. 04:30P )
|
---|
| 219 | N AMT,X
|
---|
| 220 | S AMT=$$ELAPSE^PRSPESR2(MEAL,START,STOP)
|
---|
| 221 | S X=$P(AMT,":",2) S X=$S(X=30:5,X=15:25,X=45:75,1:0)
|
---|
| 222 | S AMT=+$P(AMT,":",1)_"."_X
|
---|
| 223 | Q AMT
|
---|