| 1 | PRSATE ;WCIOFO/JAH - Enter/Edit Employee (emp) Tour of Duty (ToD) ;03/15/2005 | 
|---|
| 2 | ;;4.0;PAID;**8,11,27,45,55,93**;Sep 21, 1995;Build 7 | 
|---|
| 3 | ;;Per VHA Directive 2004-038, this routine should not be modified. | 
|---|
| 4 | N PPI,PPE,PRSTLV,TLI,TLE,DFN | 
|---|
| 5 | ; | 
|---|
| 6 | ;    PPI =  pay period (pp) internal #. | 
|---|
| 7 | ;    PPE = pp external form (99-06). | 
|---|
| 8 | ;    PRSTLV = flag indicates timekeeper (TK) in T&L lookup ^PRSAUTL. | 
|---|
| 9 | ;    TLI = T&L unit internal #. | 
|---|
| 10 | ;    TLU = T&L unit # 3-digit | 
|---|
| 11 | ; | 
|---|
| 12 | ;  -Get current pp-internal & external.  -Ask user for T&L. | 
|---|
| 13 | ;  -Loop to ask for emp until TK is done. | 
|---|
| 14 | ;  --Emp lookup screens emps not in T&L returned by PRSAUTL call. | 
|---|
| 15 | ; | 
|---|
| 16 | S PRSTLV=2 D ^PRSAUTL Q:TLI<1 | 
|---|
| 17 | F  S DFN=$$GETEMP^PRSATE6(TLE) Q:DFN<1  D | 
|---|
| 18 | .    S PPI=$P(^PRST(458,0),"^",3),PPE=$P($G(^PRST(458,PPI,0)),"^",1) | 
|---|
| 19 | .    D TOUREDIT(DFN,PPI,PPE,TLI,TLE,PRSTLV) | 
|---|
| 20 | Q | 
|---|
| 21 | ;======================= | 
|---|
| 22 | ; | 
|---|
| 23 | TOUREDIT(DFN,PPI,PPE,TLI,TLE,PRSTLV) ; | 
|---|
| 24 | ; | 
|---|
| 25 | N C0,NH,FLX,PMP,PP,PB,ENT,SRT,WTL,TYP,Z,TD,ERROR,NOERROR | 
|---|
| 26 | ; | 
|---|
| 27 | ;   Entitlement lookup leaks many variables.  Following R used in | 
|---|
| 28 | ;   this routine but may be looked up again despite the fact they R | 
|---|
| 29 | ;   leaked by ^PRSAENT.  See PRSAENT for further doc. | 
|---|
| 30 | ; | 
|---|
| 31 | ;    C0=emps 0 node in file 450    NH= emps 8B normal hrs | 
|---|
| 32 | ;    FLX= compressed/flextime code (0=none,C=compressed,F=flextime) | 
|---|
| 33 | ;    PMP= premium pay indicator | 
|---|
| 34 | ;      ( D=entitled Sun., F=entitled Sat./Sun., | 
|---|
| 35 | ;        E=entitled variable Sat./Sun. premium pay, | 
|---|
| 36 | ;        G=entitled variable Sun. prem pay, X=title 5 emps | 
|---|
| 37 | ;        R,C,O=different types of firefighters) | 
|---|
| 38 | ;  * PP= emps pay plan | 
|---|
| 39 | ;    DB = pay basis-1:full,2:part,3:intermit | 
|---|
| 40 | ;    ENT= 39 char entitlement string | 
|---|
| 41 | ; | 
|---|
| 42 | ;  Entitlement lookup. | 
|---|
| 43 | ; | 
|---|
| 44 | D ^PRSAENT I ENT="" D ERROR(1) S OUT=1 Q | 
|---|
| 45 | ; | 
|---|
| 46 | ; Display header/Ask pp (NOL^PRSATE2 returns SRT = Current, Next, Last) | 
|---|
| 47 | ; | 
|---|
| 48 | D NOW^%DTC S NOW=% | 
|---|
| 49 | W:$E(IOST,1,2)="C-" @IOF | 
|---|
| 50 | W !?26,"VA TIME & ATTENDANCE SYSTEM" | 
|---|
| 51 | W !?29,"EMPLOYEE TOUR OF DUTY" | 
|---|
| 52 | D HDR^PRSADP1,NOL^PRSATE2 | 
|---|
| 53 | Q:SRT="^" | 
|---|
| 54 | I SRT="L" S PPI=PPI-1,PPE=$P($G(^PRST(458,PPI,0)),"^",1) | 
|---|
| 55 | ; | 
|---|
| 56 | ;  Get emp's flexitime code | 
|---|
| 57 | ; | 
|---|
| 58 | S FLX=$$FLEXIND^PRSATE6(PPI,DFN,SRT) | 
|---|
| 59 | ; | 
|---|
| 60 | ;  Is emp entitled reg. shed. hrs.? | 
|---|
| 61 | ; | 
|---|
| 62 | I $E(ENT,1)="0" D | 
|---|
| 63 | .  S Z=$E(ENT,2),TD=$S(Z="D":3,1:4) D NONE | 
|---|
| 64 | E  D | 
|---|
| 65 | .; | 
|---|
| 66 | .;    initialize t&l for this ToD | 
|---|
| 67 | .; | 
|---|
| 68 | .  S WTL=TLI | 
|---|
| 69 | .  I "NL"[SRT D | 
|---|
| 70 | ..    S TYP=0 | 
|---|
| 71 | .  E  D | 
|---|
| 72 | ..    S TYP=$$ISTEMPTR() | 
|---|
| 73 | ..; | 
|---|
| 74 | ..;  For temp ToDs--ask user for T&L ToD will be worked | 
|---|
| 75 | ..;  Quit if we don't get a valid T&L unit. | 
|---|
| 76 | ..; | 
|---|
| 77 | ..    I TYP S WTL=$$ASKTLWRK^PRSATE6(TLE) | 
|---|
| 78 | .; | 
|---|
| 79 | .;  Save current ToD in case user aborts with an unacceptable ToD. | 
|---|
| 80 | .; | 
|---|
| 81 | .   D SAVETOUR^PRSATE6(PPI,DFN) | 
|---|
| 82 | .; | 
|---|
| 83 | .  I WTL'<1,TYP'["^" D | 
|---|
| 84 | ..    D A1 | 
|---|
| 85 | ..; | 
|---|
| 86 | ..; verify firefighter ToD after compressed ind. edit.  Don't accept | 
|---|
| 87 | ..; ToD until its within guidlines. If TK force exits, restore old ToD. | 
|---|
| 88 | ..; | 
|---|
| 89 | ..  S NOERROR=0 | 
|---|
| 90 | ..  F  D  Q:NOERROR | 
|---|
| 91 | ...    N ERROR D FFTOUR^PRSATE6(PPI,DFN,SRT,.ERROR) | 
|---|
| 92 | ...    I $$ISERRORS^PRSATE6(.ERROR) D | 
|---|
| 93 | ....      I $$ASKTOFIX^PRSATE6() D | 
|---|
| 94 | .....        D A1 | 
|---|
| 95 | ....      E  D | 
|---|
| 96 | .....        D RESTORE^PRSATE6(PPI,DFN) S NOERROR=1 | 
|---|
| 97 | ...    E  D | 
|---|
| 98 | ....      S NOERROR=1 | 
|---|
| 99 | Q | 
|---|
| 100 | ;======================= | 
|---|
| 101 | ; | 
|---|
| 102 | ISTEMPTR() ; IS TEMPORARY ToD ? | 
|---|
| 103 | ; Ask user if ToD is temp or perm & convert TYP to true false flag | 
|---|
| 104 | ;    Permanent set TYP=0,  Temporary set TYP=true (1) | 
|---|
| 105 | ; | 
|---|
| 106 | S TYP=$$ASKTEMP^PRSATE6() I TYP'["^" S TYP=$E(TYP,1)="T",WTL=TLI | 
|---|
| 107 | Q TYP | 
|---|
| 108 | ;======================= | 
|---|
| 109 | ; | 
|---|
| 110 | A1 ; Set up for emps ToD look up. Screen allows Daily ToDs & days off | 
|---|
| 111 | ; for daily emps.  Everyone else gets days off & all other ToDs. | 
|---|
| 112 | ; Screen further ensures ToD is available either to all t&ls | 
|---|
| 113 | ; or to t&l that this emp is working in. | 
|---|
| 114 | ; | 
|---|
| 115 | N DIC,X | 
|---|
| 116 | S DIC="^PRST(457.1,",DIC(0)="AEQMN" | 
|---|
| 117 | S DIC("S")="I "_$S($E(ENT,1)="D":"Y<3",1:"Y>5!(Y=1)")_",$P(^PRST(457.1,+Y,0),U,4)!($D(^PRST(457.1,+Y,""T"",""B"",WTL)))" | 
|---|
| 118 | ; | 
|---|
| 119 | ; Setup a fixed or varying ToD.  Compressed ToDs must be varying; | 
|---|
| 120 | ; ask TK about all others. | 
|---|
| 121 | ; | 
|---|
| 122 | I FLX="C" D | 
|---|
| 123 | .   D VAR | 
|---|
| 124 | E  D | 
|---|
| 125 | .  S X=$$ASKFIXED() | 
|---|
| 126 | .  Q:X="^" | 
|---|
| 127 | .  I X="N" D | 
|---|
| 128 | ..    D VAR | 
|---|
| 129 | .  E  D FX | 
|---|
| 130 | Q | 
|---|
| 131 | ;======================= | 
|---|
| 132 | ; | 
|---|
| 133 | FX ; Fixed ToD | 
|---|
| 134 | S DIC("A")="Select TOUR OF DUTY: " | 
|---|
| 135 | W ! D ^DIC | 
|---|
| 136 | Q:Y'>0 | 
|---|
| 137 | S TD=+Y,Y=$G(^PRST(457.1,TD,1)),TDH=$P(^(0),"^",6),HRS=TDH*10 | 
|---|
| 138 | S (ZENT,STR)="" | 
|---|
| 139 | D OT^PRSATP,VS^PRSATE0 | 
|---|
| 140 | I STR'="" W *7,!!,STR G FX | 
|---|
| 141 | I '$D(^PRST(458,PPI,"E",DFN,"D",0)) S ^(0)="^458.02^14^14" | 
|---|
| 142 | I SRT="N" D | 
|---|
| 143 | .  D F1 | 
|---|
| 144 | E  D | 
|---|
| 145 | .  F DAY=2:1:6,9:1:13 D SET | 
|---|
| 146 | .  S TD=1,(Y,TDH)="" F DAY=1,7,8,14 D SET | 
|---|
| 147 | .  W "  ... done" D:HRS'=NH ERROR(2,NH,HRS) | 
|---|
| 148 | .  D T2,^PRSATE5 | 
|---|
| 149 | D HOL,RS | 
|---|
| 150 | Q | 
|---|
| 151 | ;======================= | 
|---|
| 152 | ; | 
|---|
| 153 | F1 F DAY=2:1:6,9:1:13 D NX | 
|---|
| 154 | S TD=1 F DAY=1,7,8,14 D NX | 
|---|
| 155 | W "  ... done" | 
|---|
| 156 | D:HRS'=NH ERROR(2,NH,HRS) | 
|---|
| 157 | Q | 
|---|
| 158 | ;======================= | 
|---|
| 159 | ; | 
|---|
| 160 | VAR ; Variable ToD | 
|---|
| 161 | D ^PRSATE0 | 
|---|
| 162 | I SRT'="N" D T2,^PRSATE5 | 
|---|
| 163 | D HOL,RS | 
|---|
| 164 | Q | 
|---|
| 165 | ;======================= | 
|---|
| 166 | ; | 
|---|
| 167 | NONE ; No ToD | 
|---|
| 168 | N TYP2,UPDT,Y,TDH | 
|---|
| 169 | W !!,"This is an intermittent employee with no specified tour." | 
|---|
| 170 | W !!,"Time records will now be updated to indicate this." | 
|---|
| 171 | I '$D(^PRST(458,PPI,"E",DFN,"D",0)) S ^(0)="^458.02^14^14" | 
|---|
| 172 | I '$$PERM^PRSALIB(PPI,DFN) D | 
|---|
| 173 | .  W !!,"Not all tour days are assigned a permanent status." | 
|---|
| 174 | .  I $$UPDTQ^PRSALIB(),$$TMPST^PRSALIB(.TYP2) D UPDSTAT^PRSALIB(PPI,DFN,TYP2) | 
|---|
| 175 | S (Y,TDH)="",TYP=0,WTL=TLI | 
|---|
| 176 | I SRT="N" D | 
|---|
| 177 | .  F DAY=1:1:14 D NX | 
|---|
| 178 | E  D | 
|---|
| 179 | .  F DAY=1:1:14 D SET | 
|---|
| 180 | W "  ... done" | 
|---|
| 181 | D HOL,RS | 
|---|
| 182 | Q | 
|---|
| 183 | ;======================= | 
|---|
| 184 | ; | 
|---|
| 185 | RS ; Get Comp Ind | 
|---|
| 186 | S Y=$G(^PRST(458,PPI,"E",DFN,0)) | 
|---|
| 187 | S FLX=$S((SRT="N")&($P(Y,U,7)]""):$P(Y,U,7),1:$P(Y,U,6)) | 
|---|
| 188 | S DIR(0)="SAM^C:Compressed;F:Flexitime;0:None" | 
|---|
| 189 | S DIR("A")="Compressed Tour Indicator: " | 
|---|
| 190 | S DIR("B")=$S(FLX="C":"Compressed",FLX="F":"Flexitime",1:"None") | 
|---|
| 191 | D ^DIR K DIR I "^C^F^0^"'[(U_Y_U) S Y=FLX | 
|---|
| 192 | ; | 
|---|
| 193 | ;  Intermittent employee cannot have compressed tour. | 
|---|
| 194 | ; | 
|---|
| 195 | I $P(C0,U,10)=3,Y="C" D  G RS | 
|---|
| 196 | .   W *7,!?5,"Compressed tour not valid for this employee." | 
|---|
| 197 | ; | 
|---|
| 198 | I Y="F" S Z=0 D  I Z G RS | 
|---|
| 199 | .S PAY=$P(C0,U,21),PB=$P(C0,U,20) | 
|---|
| 200 | .I "0123456789GU"'[PAY S Z=1 | 
|---|
| 201 | .I PAY="G",PB'=2 S Z=1 | 
|---|
| 202 | .I PAY="U","27EXT"'[PB S Z=1 | 
|---|
| 203 | .I Z W *7,!?5,"Flexitime not valid for this employee." | 
|---|
| 204 | .Q | 
|---|
| 205 | S $P(^PRST(458,PPI,"E",DFN,0),U,$S(SRT="N":7,1:6))=Y | 
|---|
| 206 | I $D(^PRST(458,"ATC",DFN)) D UPD^PRSASAL | 
|---|
| 207 | Q | 
|---|
| 208 | ;======================= | 
|---|
| 209 | ; | 
|---|
| 210 | NX ; Set Next ToD | 
|---|
| 211 | S Z=$G(^PRST(458,PPI,"E",DFN,"D",DAY,0)) | 
|---|
| 212 | Q:$P(Z,"^",2)=TD&('$P(Z,"^",3)) | 
|---|
| 213 | ; | 
|---|
| 214 | S $P(Z,"^",3,4)="2^"_TD,$P(Z,"^",10,11)=DUZ_"^"_NOW | 
|---|
| 215 | S ^PRST(458,PPI,"E",DFN,"D",DAY,0)=Z,^PRST(458,"ATC",DFN,PPI,DAY)="" | 
|---|
| 216 | Q | 
|---|
| 217 | ;======================= | 
|---|
| 218 | ; | 
|---|
| 219 | SET ; Set ToD | 
|---|
| 220 | N ZLASTPP | 
|---|
| 221 | S U="^" | 
|---|
| 222 | ; | 
|---|
| 223 | ; Get Zero node of emp pp rec, Old ToD, & Prior scheduled ToD. | 
|---|
| 224 | ; ZLASTPP is true if a ToD present on this day last pp. | 
|---|
| 225 | ; | 
|---|
| 226 | S Z=$G(^PRST(458,PPI,"E",DFN,"D",DAY,0)) | 
|---|
| 227 | S ZLASTPP=$P($G(^PRST(458,PPI-1,"E",DFN,"D",DAY,0)),U,2)'="" | 
|---|
| 228 | S OLD=$P(Z,U,2),SCH=$P(Z,U,4) | 
|---|
| 229 | ; | 
|---|
| 230 | ; Quit if old ToD=this ToD & emp rec start/stop=ToD file start/stop. | 
|---|
| 231 | ; | 
|---|
| 232 | Q:(OLD=TD)&($G(^PRST(458,PPI,"E",DFN,"D",DAY,1))=Y) | 
|---|
| 233 | ; | 
|---|
| 234 | ; Z is updated with new ToD info & replaces the emp ToD record. | 
|---|
| 235 | ; | 
|---|
| 236 | S $P(Z,U,8)=TDH | 
|---|
| 237 | S $P(Z,U,10,11)=DUZ_U_NOW | 
|---|
| 238 | I $P(Z,U,12) S $P(Z,U,12)="" ; remove holiday flag | 
|---|
| 239 | ; | 
|---|
| 240 | ; Temp ToD, store T&L ToD will be worked if it's not emp's usual t&l. | 
|---|
| 241 | ; | 
|---|
| 242 | I TYP S:TLI'=WTL $P(Z,U,9)=WTL | 
|---|
| 243 | ; | 
|---|
| 244 | ; No existing ToD on this day. | 
|---|
| 245 | ; | 
|---|
| 246 | I OLD="" D | 
|---|
| 247 | .  S $P(Z,U,1,3)=DAY_U_TD_U_TYP | 
|---|
| 248 | .  I ZLASTPP D S0 | 
|---|
| 249 | E  D | 
|---|
| 250 | .; | 
|---|
| 251 | .;  clean out postings and other ToD info since ToD is changing | 
|---|
| 252 | .; | 
|---|
| 253 | .  D CLEANTOD(PPI,DFN,DAY,TD) | 
|---|
| 254 | .; | 
|---|
| 255 | .; | 
|---|
| 256 | .; | 
|---|
| 257 | .  S:SCH $P(Z,U,5,7)="^^" | 
|---|
| 258 | .  I SCH="" D | 
|---|
| 259 | ..    S $P(Z,U,2,4)=TD_U_TYP_U_OLD | 
|---|
| 260 | ..    D S0 | 
|---|
| 261 | .  E  D | 
|---|
| 262 | ..    I SCH=TD D | 
|---|
| 263 | ...      S $P(Z,U,2,4)=TD_"^^" | 
|---|
| 264 | ...      K ^PRST(458,"ATC",DFN,PPI,DAY) | 
|---|
| 265 | ..    E  D | 
|---|
| 266 | ...      S $P(Z,U,2,3)=TD_U_TYP | 
|---|
| 267 | ...      D S0 | 
|---|
| 268 | ; | 
|---|
| 269 | D S1 | 
|---|
| 270 | Q | 
|---|
| 271 | ;======================= | 
|---|
| 272 | ; | 
|---|
| 273 | ; Set up x-ref for supervisor approval of ToD change | 
|---|
| 274 | ; | 
|---|
| 275 | S0 S ^PRST(458,"ATC",DFN,PPI,DAY)="" | 
|---|
| 276 | Q | 
|---|
| 277 | ;======================= | 
|---|
| 278 | ; | 
|---|
| 279 | S1 ; | 
|---|
| 280 | S ^PRST(458,PPI,"E",DFN,"D",DAY,0)=Z S:Y'="" ^(1)=Y | 
|---|
| 281 | Q | 
|---|
| 282 | ;======================= | 
|---|
| 283 | ; | 
|---|
| 284 | T2 ; Ask if second ToD | 
|---|
| 285 | N X | 
|---|
| 286 | ; | 
|---|
| 287 | ;  Don't ask for Daily ToDs | 
|---|
| 288 | ; | 
|---|
| 289 | Q:$E(ENT,1)="D" | 
|---|
| 290 | ; | 
|---|
| 291 | S X=$$ASK2NDTR() | 
|---|
| 292 | Q:X'="Y"  G ^PRSATE4 | 
|---|
| 293 | ;======================= | 
|---|
| 294 | ; | 
|---|
| 295 | HOL ; Determine if Holiday within ToD | 
|---|
| 296 | N DAY | 
|---|
| 297 | D ^PRSAPPH | 
|---|
| 298 | Q:'$D(HOL) | 
|---|
| 299 | S TT="HX",DUP=1 | 
|---|
| 300 | D E^PRSAPPH | 
|---|
| 301 | Q | 
|---|
| 302 | ;======================= | 
|---|
| 303 | ; | 
|---|
| 304 | CLEANTOD(PPI,DFN,DAY,TD) ; CLEAN OUT TOUR | 
|---|
| 305 | N PRSDT,MIEN | 
|---|
| 306 | K ^PRST(458,PPI,"E",DFN,"D",DAY,1),^(2),^(3),^(10) I TD<5 K ^(4) S $P(Z,U,13,15)="^^" | 
|---|
| 307 | ; if employee is PTP with active memo then reset the ESR day | 
|---|
| 308 | S PRSDT=$P($G(^PRST(458,PPI,1)),U,DAY) | 
|---|
| 309 | S MIEN=$$MIEN^PRSPUT1(DFN,PRSDT) | 
|---|
| 310 | I MIEN D | 
|---|
| 311 | . N PRSFDA | 
|---|
| 312 | . S PRSFDA(458.02,DAY_","_DFN_","_PPI_",",146)="3" ; status = resubmit | 
|---|
| 313 | . S PRSFDA(458.02,DAY_","_DFN_","_PPI_",",148)="Tour Changed" ; remarks | 
|---|
| 314 | . D FILE^DIE("","PRSFDA"),MSG^DIALOG() | 
|---|
| 315 | Q | 
|---|
| 316 | ;======================= | 
|---|
| 317 | ; | 
|---|
| 318 | ERROR(NUM,VAR1,VAR2) ; | 
|---|
| 319 | W *7,!! | 
|---|
| 320 | I NUM=1 W "Employee has no Pay Entitlement table entry." | 
|---|
| 321 | I NUM=2 D | 
|---|
| 322 | .  Q:$G(NH)=112 | 
|---|
| 323 | .  W "Warning: Normal Hours are ",$G(VAR1),"; Tour Hours are ",$G(VAR2) | 
|---|
| 324 | Q | 
|---|
| 325 | ;======================= | 
|---|
| 326 | ; | 
|---|
| 327 | ASKFIXED() ;GET USER'S YES OR NO RESPONSE TO FIXED ToD QUESTION | 
|---|
| 328 | N DIR,DIRUT,Y | 
|---|
| 329 | S DIR("A")="Do you wish to enter a fixed Mon-Fri Tour" | 
|---|
| 330 | S DIR(0)="Y" | 
|---|
| 331 | S DIR("?")="Answer NO to create any other type of tour." | 
|---|
| 332 | S DIR("?",1)="Fixed tours are Monday - Friday with the same hours." | 
|---|
| 333 | D ^DIR | 
|---|
| 334 | S RESP=$S(Y=1:"Y",Y=0:"N",1:"^") | 
|---|
| 335 | Q RESP | 
|---|
| 336 | ;======================= | 
|---|
| 337 | ; | 
|---|
| 338 | ASK2NDTR() ;GET USER'S YES OR NO RESPONSE TO 2nd ToD QUESTION | 
|---|
| 339 | N DIR,DIRUT,Y | 
|---|
| 340 | S DIR("A")="Do you wish to enter a Second Tour for any Day" | 
|---|
| 341 | S DIR(0)="Y" | 
|---|
| 342 | S DIR("B")="N" | 
|---|
| 343 | S DIR("?",1)="Answer Yes to add a second tour.  No to continue." | 
|---|
| 344 | S DIR("?")="Enter ^ to escape and cancel this tour change." | 
|---|
| 345 | D ^DIR | 
|---|
| 346 | S RESP=$S(Y=1:"Y",Y=0:"N",1:"^") | 
|---|
| 347 | Q RESP | 
|---|
| 348 | ;======================= | 
|---|
| 349 | ; | 
|---|