| 1 | PRSPUT1 ;WOIFO/MGD - PART TIME PHYSICIAN UTILITIES #1 ;05/17/05 | 
|---|
| 2 | ;;4.0;PAID;**93**;Sep 21, 1995;Build 7 | 
|---|
| 3 | ;;Per VHA Directive 2004-038, this routine should not be modified. | 
|---|
| 4 | ; | 
|---|
| 5 | ;The following routine contains various utilities for the  Part Time | 
|---|
| 6 | ;Physician functionality that was added as part of patch PRS*4.0*93. | 
|---|
| 7 | ; | 
|---|
| 8 | ;---------------------------------------------------------------------- | 
|---|
| 9 | ; Determine the IEN of the PT Physician's memorandum if any for the | 
|---|
| 10 | ; current date or the date specified in the MDAT parameter. | 
|---|
| 11 | ; Input: PTPIEN - IEN of the PT Physician | 
|---|
| 12 | ;          MDAT - Optional - date within memorandum in FileMan format | 
|---|
| 13 | ; | 
|---|
| 14 | ; Output: IEN^STATUS | 
|---|
| 15 | ;         IEN - of the PT Phy's memorandum in the #458.7 file or 0 | 
|---|
| 16 | ;      STATUS - of the memorandum | 
|---|
| 17 | ;----------------------------------------------------------------------- | 
|---|
| 18 | MIEN(PRSIEN,MDAT) ; | 
|---|
| 19 | Q:'PRSIEN 0_"^" | 
|---|
| 20 | N ENDAT,MDATA,QUIT,STATUS,STDAT,TDAT,MIEN | 
|---|
| 21 | S MDAT=$G(MDAT,DT) | 
|---|
| 22 | S (MIEN,QUIT)=0 | 
|---|
| 23 | F  S MIEN=$O(^PRST(458.7,"B",PRSIEN,MIEN)) Q:'MIEN  D  Q:QUIT | 
|---|
| 24 | . S MDATA=$G(^PRST(458.7,MIEN,0)) | 
|---|
| 25 | . S STDAT=$P(MDATA,U,2)                  ; START DATE OF MEMORANDUM | 
|---|
| 26 | . S ENDAT=$P(MDATA,U,3)                  ; END DATE OF MEMORANDUM | 
|---|
| 27 | . S STATUS=$P(MDATA,U,6)                 ; STATUS OF MEMORANDUM | 
|---|
| 28 | . S TDAT=$P($G(^PRST(458.7,MIEN,4)),U,1) ; TERMINATION DATE | 
|---|
| 29 | . I TDAT D | 
|---|
| 30 | . . I TDAT<ENDAT S ENDAT=TDAT | 
|---|
| 31 | . I MDAT'<STDAT,MDAT'>ENDAT S QUIT=1 | 
|---|
| 32 | I MIEN="" S MIEN=0,STATUS=0 | 
|---|
| 33 | Q MIEN_"^"_STATUS | 
|---|
| 34 | ; | 
|---|
| 35 | ;----------------------------------------------------------------------- | 
|---|
| 36 | ;Display information on a PT Physician's memoranda | 
|---|
| 37 | ; Input: PRSIEN - IEN of the PT Physician. | 
|---|
| 38 | ;        SCRTTL - Title for the screen. | 
|---|
| 39 | ;         ARRAY - The array where the message to be printed will be | 
|---|
| 40 | ;                 stored. (optional) If not specified, no array will | 
|---|
| 41 | ;                 be created. | 
|---|
| 42 | ;         INDEX - The index where the array will start. (optional) This | 
|---|
| 43 | ;                 will be set to 1 if no index is passed. | 
|---|
| 44 | ;           PPI - Optional: IEN of the desired PP.  If supplied, the | 
|---|
| 45 | ;                 external format will be displayed on line | 
|---|
| 46 | ; | 
|---|
| 47 | ; Output: VA header, screen title and 10 fields to identify the PT Phy | 
|---|
| 48 | ;         Array with the same data if the ARRAY parameter is passed. | 
|---|
| 49 | ;----------------------------------------------------------------------- | 
|---|
| 50 | HDR(PRSIEN,SCRTTL,ARRAY,INDEX,PPI) ; | 
|---|
| 51 | Q:'PRSIEN | 
|---|
| 52 | S SCRTTL=$G(SCRTTL,"") | 
|---|
| 53 | S ARRAY=$G(ARRAY,"") | 
|---|
| 54 | I $G(INDEX)="",($G(ARRAY)'="") D INDEX | 
|---|
| 55 | N C0,DATE,PPE,SSN,TAB,TEXT,X,YR | 
|---|
| 56 | I $G(PPI)="" D  ; If no PPI passed in get last PP in #459 | 
|---|
| 57 | . S PPE="A",PPE=$O(^PRST(459,PPE),-1) | 
|---|
| 58 | . S PPE=$P($G(^PRST(459,PPE,0)),U,1) | 
|---|
| 59 | I $G(PPI)>0 S PPE=$P($G(^PRST(458,PPI,0)),U,1) | 
|---|
| 60 | S TEXT="PP:"_PPE,$E(TEXT,26)="",TEXT=TEXT_"VA TIME & ATTENDANCE SYSTEM" | 
|---|
| 61 | D NOW^%DTC | 
|---|
| 62 | S YR=%I(3)+1700,YR=$E(YR,3,4) | 
|---|
| 63 | S DATE=%I(1)_"/"_%I(2)_"/"_YR | 
|---|
| 64 | S $E(TEXT,73)="",TEXT=TEXT_DATE | 
|---|
| 65 | D A1 ; Line #1 | 
|---|
| 66 | S TAB=39-($L(SCRTTL)\2) | 
|---|
| 67 | S $E(TEXT,TAB)="",TEXT=TEXT_SCRTTL | 
|---|
| 68 | D A1 ; Line #2 | 
|---|
| 69 | S C0=^PRSPC(PRSIEN,0) | 
|---|
| 70 | S TEXT=$P(C0,U,1),$E(TEXT,70)="" | 
|---|
| 71 | S SSN=$P(C0,U,9) | 
|---|
| 72 | S SSN="XXX-XX-"_$E(SSN,6,9) | 
|---|
| 73 | S TEXT=TEXT_SSN | 
|---|
| 74 | D A1 ; Line #3 | 
|---|
| 75 | S TEXT="Pay Plan: "_$P(C0,"^",21)_"     Duty Basis: "_$P(C0,"^",10) | 
|---|
| 76 | S TEXT=TEXT_"     FLSA: "_$P(C0,"^",12)_"     Normal Hours: " | 
|---|
| 77 | S TEXT=TEXT_$J($P(C0,"^",16),3)_"     Comp/Flex: " | 
|---|
| 78 | S TEXT=TEXT_$P($G(^PRSPC(PRSIEN,1)),"^",7) | 
|---|
| 79 | D A1 ; Line #4 | 
|---|
| 80 | S TEXT="T&L: "_$P(C0,"^",8),$E(TEXT,69)="" | 
|---|
| 81 | S TEXT=TEXT_"Station: "_$P(C0,"^",7) | 
|---|
| 82 | D A1 ; Line #5 | 
|---|
| 83 | K INDEX,%I | 
|---|
| 84 | Q | 
|---|
| 85 | ; | 
|---|
| 86 | ;----------------------------------------------------------------------- | 
|---|
| 87 | ; Display information on a PT Physician's memoranda | 
|---|
| 88 | ; Input: PRSIEN - IEN of the PT Physician | 
|---|
| 89 | ;          MIEN - IEN of the PT Phy's memorandum in #458.7 | 
|---|
| 90 | ;         ARRAY - The array where the message to be printed will be | 
|---|
| 91 | ;                 stored. (Optional) If not specified, no array will | 
|---|
| 92 | ;                 be created. | 
|---|
| 93 | ;         INDEX - The index where the array will start. (optional) This | 
|---|
| 94 | ;                 will be set to 1 if no index is passed. | 
|---|
| 95 | ;         HRSCO - Carrryover Hours from a prior memorandum. (optional) | 
|---|
| 96 | ; | 
|---|
| 97 | ; Output: 4 line summary of the PT Phy's current memorandum | 
|---|
| 98 | ;         Array with the same data if the ARRAY parameter is passed. | 
|---|
| 99 | ;----------------------------------------------------------------------- | 
|---|
| 100 | MEM(PRSIEN,MIEN,ARRAY,INDEX,HRSCO) ; | 
|---|
| 101 | Q:'PRSIEN&('MIEN) | 
|---|
| 102 | I $G(INDEX)="",($G(ARRAY)'="") D INDEX | 
|---|
| 103 | N AHRS,AHTCM,COHRS,DATA,EDAT,ENDDAT,HRSWK,HTSHBW,I,IEN458,LASTDAY,LASTPP | 
|---|
| 104 | N LASTPPE,LPPP,NPHRS,OTHRS,POHC,POMC,POT,PPP,QUIT,TAB,TDAT,TDATEX,TEXT | 
|---|
| 105 | N THRSWK,TTEXT,WPHRS | 
|---|
| 106 | ; Load 0 node from #458.7.  Quit if it doesn't exist | 
|---|
| 107 | S DATA=$G(^PRST(458.7,MIEN,0)) | 
|---|
| 108 | Q:DATA="" | 
|---|
| 109 | ; Determine last PP processed | 
|---|
| 110 | S LASTPP="A" | 
|---|
| 111 | S LASTPP=$O(^PRST(459,LASTPP),-1) | 
|---|
| 112 | Q:'LASTPP | 
|---|
| 113 | S LASTPPE=$P(^PRST(459,LASTPP,0),U,1) | 
|---|
| 114 | S IEN458="",IEN458=$O(^PRST(458,"B",LASTPPE,IEN458)) | 
|---|
| 115 | Q:'IEN458 | 
|---|
| 116 | S LASTDAY=$P($G(^PRST(458,IEN458,2)),U,14) | 
|---|
| 117 | S TTEXT="Memorandum & Leave Status thru PP "_LASTPPE_" Ending "_LASTDAY | 
|---|
| 118 | S TAB=40-($L(TTEXT)\2) | 
|---|
| 119 | S $E(TEXT,TAB)="",TEXT=TEXT_TTEXT | 
|---|
| 120 | D A1 ; Line #1 | 
|---|
| 121 | S Y=$P(DATA,U,2) ;       START DATE | 
|---|
| 122 | D DD^%DT | 
|---|
| 123 | S STDAT=Y | 
|---|
| 124 | S (EDAT,Y)=$P(DATA,U,3) ;       END DATE | 
|---|
| 125 | D DD^%DT | 
|---|
| 126 | S ENDDAT=Y | 
|---|
| 127 | ; Check for Termination | 
|---|
| 128 | S (TDAT,Y)=+$G(^PRST(458.7,MIEN,4)) | 
|---|
| 129 | D DD^%DT | 
|---|
| 130 | S TDATEX=Y ; Termination Date External | 
|---|
| 131 | S AHRS=$P(DATA,U,4)   ; AGREED HOURS | 
|---|
| 132 | S COHRS=$P(DATA,U,9)  ; CARRYOVER HOURS | 
|---|
| 133 | S HRSCO=$G(HRSCO,0)   ; HRS CARRIED OVER FROM PRIOR MEMO | 
|---|
| 134 | S NPHRS=$P(DATA,U,12) ; NON-PAY HOURS | 
|---|
| 135 | S WPHRS=$P(DATA,U,13) ; WITHOUT PAY HOURS | 
|---|
| 136 | S THRSWK=0.00 ; TOTAL HOURS WORKED | 
|---|
| 137 | S POMC=0.00  ;   PERCENTAGE OF MEMORANDA COMPLETED | 
|---|
| 138 | S POHC=0.00  ;   PERCENTAGE OF HOURS COMPLETED | 
|---|
| 139 | S AHTCM=0.00 ;  AVERAGE HOURS TO COMPLETE MEMORANDUM | 
|---|
| 140 | S POT=0.00   ;    % OFF TARGET | 
|---|
| 141 | S OTHRS=0.00 ;  OFF TARGET HOURS | 
|---|
| 142 | S HRSWK=0.00 ;  HRS TOTAL FROM WORKED PAY PERIODS | 
|---|
| 143 | ; | 
|---|
| 144 | S $E(TEXT,2)="",TEXT=TEXT_"Start Date: "_STDAT | 
|---|
| 145 | S $E(TEXT,29,31)="|  ",TEXT=TEXT_"Agreed Hours: "_$J(AHRS,7,2) | 
|---|
| 146 | S $E(TEXT,55,57)="|  ",TEXT=TEXT_"      LWOP Hrs: "_$J(WPHRS,7,2) | 
|---|
| 147 | D A1 ; Line #2 | 
|---|
| 148 | ; | 
|---|
| 149 | S LPPP=$$MEMCPP^PRSPUT3(MIEN) | 
|---|
| 150 | S PPP=$P(LPPP,U,2),LPPP=$P(LPPP,U,1) | 
|---|
| 151 | ; Check to see if last PP certified in #458 is in #459 | 
|---|
| 152 | I LPPP'="",'$D(^PRST(459,"B",LPPP)) S PPP=PPP-1 | 
|---|
| 153 | ; Loop to determine the total hours worked from multiple | 
|---|
| 154 | F I=1:1:PPP D | 
|---|
| 155 | . S HRSWK=HRSWK+$$GET1^DIQ(458.701,I_","_MIEN_",",1) | 
|---|
| 156 | S THRSWK=HRSWK+COHRS+HRSCO ; Adjust for carryover hours | 
|---|
| 157 | ; Hrs That Should Have Been Worked - has any NP and WP included | 
|---|
| 158 | S HTSHBW=((AHRS/26)*PPP)-NPHRS-WPHRS | 
|---|
| 159 | S OTHRS=THRSWK-HTSHBW | 
|---|
| 160 | S POHC=THRSWK/(AHRS-NPHRS-WPHRS)*100 ; Adjust % or Hrs Completed | 
|---|
| 161 | ; Only calculate the following if memo has started and not ended | 
|---|
| 162 | I PPP,PPP<26 D | 
|---|
| 163 | . I HTSHBW'=THRSWK D  ; PTP has worked more or less than Ave Hrs/PP | 
|---|
| 164 | . . I THRSWK'<(AHRS-NPHRS-WPHRS) S AHTCM=0 | 
|---|
| 165 | . . I THRSWK<(AHRS-NPHRS-WPHRS) S AHTCM=AHRS-THRSWK-NPHRS-WPHRS/(26-PPP) | 
|---|
| 166 | . . S POT=(AHRS/26*PPP)-WPHRS-NPHRS | 
|---|
| 167 | . . S POT=THRSWK-POT/POT,POT=POT*100 | 
|---|
| 168 | . I HTSHBW=THRSWK D  ; PTP has worked exactly Ave Hrs/PP | 
|---|
| 169 | . . S AHTCM=AHRS-THRSWK-WPHRS-NPHRS/(26-PPP) | 
|---|
| 170 | . . S POT=0 | 
|---|
| 171 | I PPP=26 D  ; Memo has ended | 
|---|
| 172 | . S AHTCM=0 | 
|---|
| 173 | . S POT=(AHRS/26*PPP)-WPHRS-NPHRS | 
|---|
| 174 | . S POT=THRSWK-POT/POT,POT=POT*100 | 
|---|
| 175 | I PPP=0 D  ; 1st PP hasn't been processed | 
|---|
| 176 | . S AHTCM=AHRS-COHRS/26 | 
|---|
| 177 | . S POT=0 | 
|---|
| 178 | I TDAT D | 
|---|
| 179 | . S $E(TEXT,2)="",TEXT=TEXT_"TERMINATED: "_TDATEX | 
|---|
| 180 | I TDAT=0 S $E(TEXT,4)="",TEXT=TEXT_"End Date: "_ENDDAT | 
|---|
| 181 | S $E(TEXT,29,31)="|  ",TEXT=TEXT_"Hours Worked: "_$J(HRSWK,7,2) | 
|---|
| 182 | S $E(TEXT,55,57)="|  ",TEXT=TEXT_"   Non Pay Hrs: "_$J(NPHRS,7,2) | 
|---|
| 183 | D A1 ; Line #3 | 
|---|
| 184 | ; | 
|---|
| 185 | S POMC=PPP_" of 26 PP = "_$J(100*(PPP/26),6,2)_"%" | 
|---|
| 186 | I PPP<10 S $E(TEXT,6)="",TEXT=TEXT_POMC | 
|---|
| 187 | I PPP>9 S $E(TEXT,5)="",TEXT=TEXT_POMC | 
|---|
| 188 | S $E(TEXT,29,30)="| " | 
|---|
| 189 | S TEXT=TEXT_"Carryover Hrs: "_$J($S(HRSCO:HRSCO,1:COHRS),7,2) | 
|---|
| 190 | S $E(TEXT,55,57)="|  ",TEXT=TEXT_"Off Target Hrs: "_$J(OTHRS,7,2) | 
|---|
| 191 | D A1 ; Line #4 | 
|---|
| 192 | ; | 
|---|
| 193 | S TEXT="% Hrs Completed = "_$J(POHC,6,2)_"%" | 
|---|
| 194 | S $E(TEXT,29,31)="|  ",TEXT=TEXT_"   Total Hrs: " | 
|---|
| 195 | S TEXT=TEXT_$J(THRSWK,7,2) | 
|---|
| 196 | S $E(TEXT,55,57)="|  ",TEXT=TEXT_"  Off Target %: "_$J(POT,7,2) | 
|---|
| 197 | D A1 ; Line #5 | 
|---|
| 198 | ; | 
|---|
| 199 | I PPP<26 D | 
|---|
| 200 | . S TEXT=(AHRS-NPHRS-WPHRS)-THRSWK,TEXT=TEXT/(26-PPP) | 
|---|
| 201 | . S TEXT=$FN(TEXT,"",2) | 
|---|
| 202 | . S TEXT="   Agreement will be met by averaging "_TEXT | 
|---|
| 203 | . S TEXT=TEXT_" Hrs/PP during remainder of memo." | 
|---|
| 204 | ; | 
|---|
| 205 | I PPP=26 D | 
|---|
| 206 | . S $E(TEXT,30)="",TEXT=TEXT_"This memorandum has ended" | 
|---|
| 207 | ; | 
|---|
| 208 | I TDAT D | 
|---|
| 209 | . I LPPP'="" D | 
|---|
| 210 | . . S LPPP=$O(^PRST(458,"B",LPPP,0)) | 
|---|
| 211 | . . S LPPP=$P($G(^PRST(458,LPPP,1)),U,14) | 
|---|
| 212 | . . I TDAT'>LPPP D  Q | 
|---|
| 213 | . . . S TEXT="",$E(TEXT,30)="",TEXT=TEXT_"This memorandum has ended" | 
|---|
| 214 | ; | 
|---|
| 215 | D A1 ; Line #6 | 
|---|
| 216 | K INDEX,Y | 
|---|
| 217 | Q | 
|---|
| 218 | ; | 
|---|
| 219 | A1 ; Set TEXT into the array | 
|---|
| 220 | ; | 
|---|
| 221 | N A1 | 
|---|
| 222 | W !,TEXT | 
|---|
| 223 | I $G(ARRAY)'="" D | 
|---|
| 224 | . S A1="S "_ARRAY_INDEX_")="_""""_TEXT_"""" | 
|---|
| 225 | . X A1 | 
|---|
| 226 | . S INDEX=INDEX+1 | 
|---|
| 227 | S TEXT="" | 
|---|
| 228 | Q | 
|---|
| 229 | ; | 
|---|
| 230 | INDEX ; Get last index in array if not passed in | 
|---|
| 231 | ; | 
|---|
| 232 | S INDEX="S INDEX=$O("_ARRAY_"""A""),-1)" | 
|---|
| 233 | X INDEX | 
|---|
| 234 | I 'INDEX S INDEX=1 Q | 
|---|
| 235 | I INDEX S INDEX=INDEX+1 | 
|---|
| 236 | Q | 
|---|