PRSATE ;WCIOFO/JAH/PLT - Enter/Edit Employee (emp) Tour of Duty (ToD) ;03/15/2005
;;4.0;PAID;**8,11,27,45,55,93,112,117,121,132**;Sep 21, 1995;Build 13
;;Per VHA Directive 2004-038, this routine should not be modified.
;
;ppi=ien of 450, ppi=ien of 458, ppe=pp (yy-mm)
;tli = ien of t&l, tlu=t&l # (nnn), prstlv=2 for timekeeper user
N PPI,PPE,PRSTLV,TLI,TLE,DFN
S PRSTLV=2 D ^PRSAUTL Q:TLI<1
F S DFN=$$GETEMP^PRSATE6(TLE) Q:DFN<1 D
. S PPI=$P(^PRST(458,0),"^",3),PPE=$P($G(^PRST(458,PPI,0)),"^",1)
. D TOUREDIT(DFN,PPI,PPE,TLI,TLE,PRSTLV)
Q
;
TOUREDIT(DFN,PPI,PPE,TLI,TLE,PRSTLV) ;
N C0,NH,FLX,PMP,PP,PB,ENT,SRT,WTL,TYP,Z,TD,ERROR,NOERROR,PRSDAY,PRSETD
N PRSTW,PRSTWA,PRSTWB
;
; PRSTW: employees telework type
; PRSTWA: telework eligibilty string
; PRSTWB: this pay period (PPI) telework eligibilty
;
; Entitlement lookup leaks many variables. Following R used in
; this routine but may be looked up again despite the fact they R
; leaked by ^PRSAENT. See PRSAENT for further doc.
;
;
; C0=emps 0 node in file 450 NH= emps 8B normal hrs
; FLX= compressed/flextime code (0=none,C=compressed,F=flextime)
; PMP= premium pay indicator
; ( D=entitled Sun., F=entitled Sat./Sun.,
; E=entitled variable Sat./Sun. premium pay,
; G=entitled variable Sun. prem pay, X=title 5 emps
; R,C,O=different types of firefighters)
; * PP= emps pay plan
; DB = pay basis-1:full,2:part,3:intermit
; ENT= 39 char entitlement string
; Entitlement lookup.
D ^PRSAENT I ENT="" D ERROR(1) S OUT=1 Q
;
; Display header/Ask pp (NOL^PRSATE2 returns SRT = Current, Next, Last)
D NOW^%DTC S NOW=% K %
W:$E(IOST,1,2)="C-" @IOF
W !?26,"VA TIME & ATTENDANCE SYSTEM"
W !?29,"EMPLOYEE TOUR OF DUTY"
D HDR^PRSADP1,NOL^PRSATE2
Q:SRT="^"
I SRT="L" S PPI=PPI-1,PPE=$P($G(^PRST(458,PPI,0)),"^",1)
;
;get emp's flexitime code, telework ind.
S FLX=$$FLEXIND^PRSATE6(PPI,DFN,SRT),PRSTWA=$$TWE^PRSATE0(DFN,PPI),PRSTWB=$P(PRSTWA,U,4)="Y"
;entitled reg. scheduled is o
I $E(ENT,1)="0" D
. S Z=$E(ENT,2),TD=$S(Z="D":3,1:4) D NONE
E D
.;
.; initialize t&l for this ToD
.;
. S WTL=TLI
. I "NL"[SRT D
.. S TYP=0
. E D
.. S TYP=$$ISTEMPTR()
..;
..; For temp ToDs--ask user for T&L ToD will be worked
..; Quit if we don't get a valid T&L unit.
..;
.. I TYP S WTL=$$ASKTLWRK^PRSATE6(TLE)
.;
.; Save current ToD in case user aborts with an unacceptable ToD.
.;
. D SAVETOUR^PRSATE6(PPI,DFN)
.;
. I WTL'<1,TYP'["^" D
.. D A1
..;
..; verify firefighter ToD after compressed ind. edit. Don't accept
..; ToD until its within guidlines. If TK force exits, restore old ToD.
.. I PMP="C" S NOERROR=0 F D Q:NOERROR
... N ERROR D FFTOUR^PRSATE6(PPI,DFN,SRT,.ERROR)
... I $$ISERRORS^PRSATE6(.ERROR) D
.... I $$ASKTOFIX^PRSATE6() D
..... D A1
.... E D
..... D RESTORE^PRSATE6(PPI,DFN) S NOERROR=1
... E D
.... S NOERROR=1
K NOW Q
;
ISTEMPTR() ; IS TEMPORARY ToD ?
; Ask user if ToD is temp or perm & convert TYP to true false flag
; Permanent set TYP=0, Temporary set TYP=true (1)
;
S TYP=$$ASKTEMP^PRSATE6() I TYP'["^" S TYP=$E(TYP,1)="T",WTL=TLI
Q TYP
;
A1 ; Set up for emps ToD look up. Screen allows Daily ToDs & days off
; for daily emps. Everyone else gets days off & all other ToDs.
; Screen further ensures ToD is available either to all t&ls
; or to t&l that this emp is working in.
;
N DIC,X,DB
S DIC="^PRST(457.1,",DIC(0)="AEQMN"
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)))"
;
; Setup a fixed or varying ToD. Compressed ToDs must be varying;
; ask TK about all others.
;
S DB=$P(C0,U,10) I FLX="C"!("KM"[PP&(DB=1)&(NH=72)) D VAR QUIT
S X=$$ASKFIXED() QUIT:X="^" I X="N" D VAR QUIT
I PRSTWB S X=$$ASKTWMF^PRSATE6() QUIT:X="^" I X="Y" D FX,VAR QUIT
D FX
QUIT
;
FX ; Fixed ToD
FX1 S DIC("A")="Select TOUR OF DUTY: "
W ! D ^DIC
Q:Y'>0
S TD=+Y
;check overlap
K PRSDAY,PRSETD
F DAY=1:1:14 S $P(PRSETD,U,DAY)=$S(DAY#7<2:1,1:TD) D
. N TOLD
. S PRSDAY(DAY)=$P($G(^PRST(458,PPI,"E",DFN,"D",DAY,0)),U,1,4),$P(TOLD,U,DAY)=$S(SRT="N"&($P($G(^(0)),U,3)):$P(^(0),U,4),1:$P($G(^(0)),U,2)) S:DAY#7>1 $P(PRSDAY(DAY),U,6)=$P($G(^(0)),U,13),$P(PRSDAY(DAY),U,7,999)=$G(^(4))
. D PRSDAY^PRSATE0
. QUIT
D ENT^PRSATE5 I $G(PRSERR) K PRSERR G FX1
S Y=$G(^PRST(457.1,TD,1)),TDH=$P(^(0),"^",6),HRS=TDH*10
S (ZENT,STR)=""
D OT^PRSATP,VS^PRSATE0
I STR'="" W *7,!!,STR G FX
I '$D(^PRST(458,PPI,"E",DFN,"D",0)) S ^(0)="^458.02^14^14"
I SRT="N" D
. D F1
E D
. F DAY=2:1:6,9:1:13 D SET
. S TD=1,(Y,TDH)="" F DAY=1,7,8,14 D SET
. W " ... done" D:HRS'=NH ERROR(2,NH,HRS)
. D:'PRSTWB T2
. QUIT
I 'PRSTWB D HOL,RS K HRS,STR
QUIT
;
;
F1 F DAY=2:1:6,9:1:13 D NX
S TD=1 F DAY=1,7,8,14 D NX
W " ... done"
D:HRS'=NH ERROR(2,NH,HRS)
QUIT
;
VAR ; Variable ToD
D ^PRSATE0
I SRT'="N" D T2
D HOL,RS
Q
;
NONE ; No ToD
N TYP2,UPDT,Y,TDH,PRSTWB
S PRSTWB=0
W !!,"This is an intermittent employee with no specified tour."
W !!,"Time records will now be updated to indicate this."
I '$D(^PRST(458,PPI,"E",DFN,"D",0)) S ^(0)="^458.02^14^14"
I '$$PERM^PRSALIB(PPI,DFN) D
. W !!,"Not all tour days are assigned a permanent status."
. I $$UPDTQ^PRSALIB(),$$TMPST^PRSALIB(.TYP2) D UPDSTAT^PRSALIB(PPI,DFN,TYP2)
S (Y,TDH)="",TYP=0,WTL=TLI
I SRT="N" D
. F DAY=1:1:14 D NX
E D
. F DAY=1:1:14 D SET
W " ... done"
D HOL,RS
Q
;
;
RS ; Get Comp Ind
S Y=$G(^PRST(458,PPI,"E",DFN,0))
S FLX=$S((SRT="N")&($P(Y,U,7)]""):$P(Y,U,7),1:$P(Y,U,6))
S DIR(0)="SAM^C:Compressed;F:Flexitime;0:None"
S DIR("A")="Compressed Tour Indicator: "
S DIR("B")=$S(FLX="C":"Compressed",FLX="F":"Flexitime",1:"None")
D ^DIR K DIR I "^C^F^0^"'[(U_Y_U) S Y=FLX
;
; Intermittent employee cannot have compressed tour.
;
I $P(C0,U,10)=3,Y="C" D G RS
. W *7,!?5,"Compressed tour not valid for this employee."
;
I Y="F" S Z=0 D I Z G RS
.S PAY=$P(C0,U,21),PB=$P(C0,U,20)
.I "0123456789GU"'[PAY S Z=1
.I PAY="G",PB'=2 S Z=1
.I PAY="U","27EXT"'[PB S Z=1
.I Z W *7,!?5,"Flexitime not valid for this employee."
.Q
S $P(^PRST(458,PPI,"E",DFN,0),U,$S(SRT="N":7,1:6))=Y
I $D(^PRST(458,"ATC",DFN)) D UPD^PRSASAL
K PAY,ZENT Q
;
;
NX ; Set Next ToD
S Z=$G(^PRST(458,PPI,"E",DFN,"D",DAY,0))
I $P(Z,"^",2)=TD,'$P(Z,"^",3),'PRSTWB!($P($G(^PRST(458,PPI,"E",DFN,"D",DAY,8)),U)=$G(PRSTW(DAY))) QUIT
S $P(Z,"^",3,4)="2^"_TD,$P(Z,"^",10,11)=DUZ_"^"_NOW
S ^PRST(458,PPI,"E",DFN,"D",DAY,0)=Z S:PRSTWB $P(^(8),U,5)=$G(PRSTW(DAY))
S ^PRST(458,"ATC",DFN,PPI,DAY)=""
QUIT
;
;
SET ; Set ToD
N ZLASTPP,OLD,SCH,PRSTW1,PRSTW5
;get Zero node of emp pp rec, Old ToD, & Prior scheduled ToD.
;ZLASTPP is true if a ToD present on this day last pp.
S Z=$G(^PRST(458,PPI,"E",DFN,"D",DAY,0)),PRSTW1=$P($G(^(8)),U),PRSTW5=$P($G(^(8)),U,5),OLD=$P(Z,U,2),SCH=$P(Z,U,4)
S ZLASTPP=$P($G(^PRST(458,PPI-1,"E",DFN,"D",DAY,0)),U,2)'=""
;quit if old tour and its time segments/telework tour=edited one
I OLD=TD,$G(^PRST(458,PPI,"E",DFN,"D",DAY,1))=Y,PRSTW1=$G(PRSTW(DAY))!'$G(PRSTWB) QUIT
;Z is updated with new ToD info & replaces the emp ToD record.
S $P(Z,U,8)=TDH,$P(Z,U,10,11)=DUZ_U_NOW
I $P(Z,U,12) S $P(Z,U,12)="" ; remove holiday flag
;Temp ToD, store T&L ToD will be worked if it's not emp's usual t&l.
I TYP,TLI'=WTL S $P(Z,U,9)=WTL
;no existing ToD on this day.
I OLD="" S $P(Z,U,1,3)=DAY_U_TD_U_TYP D S0:ZLASTPP,S1,S8($G(PRSTW(DAY)),1):$G(PRSTWB) QUIT
;clean out postings and other ToD info since ToD is changing
D CLEANTOD(PPI,DFN,DAY,TD)
I SCH="" S $P(Z,U,2,4)=TD_U_TYP_U_OLD D S0,S1 D:$G(PRSTWB) S8($G(PRSTW(DAY)),1),S8(PRSTW1,5) QUIT
S $P(Z,U,5,7)="^^"
I SCH=TD,PRSTW5=$G(PRSTW(DAY))!'$G(PRSTWB) S $P(Z,U,2,4)=TD_"^^" K ^PRST(458,"ATC",DFN,PPI,DAY) D S1 D:$G(PRSTWB) S8("",5),S8($G(PRSTW(DAY)),1) QUIT
S $P(Z,U,2,3)=TD_U_TYP D S0,S1 D:$G(PRSTWB) S8($G(PRSTW(DAY)),1)
QUIT
;
;
; Set up x-ref for supervisor approval of ToD change
;
S0 S ^PRST(458,"ATC",DFN,PPI,DAY)=""
Q
;
;
S1 ;
S ^PRST(458,PPI,"E",DFN,"D",DAY,0)=Z S:Y'="" ^(1)=Y
Q
;
;a=telework tour reg/med, b=1 if reg/temp tour, 5 if prior/next tour
S8(A,B) ;set telework tour in node 8 of daily multiple
;prstwb=1 telework eligible
I '$G(PRSTWB) K ^PRST(458,PPI,"E",DFN,"D",DAY,8) QUIT
S $P(^PRST(458,PPI,"E",DFN,"D",DAY,8),U,B)=A
; if no telework data then clean up
I ^PRST(458,PPI,"E",DFN,"D",DAY,8)?."^" K ^PRST(458,PPI,"E",DFN,"D",DAY,8)
QUIT
;
;
T2 ; Ask if second ToD
N X
;
; Don't ask for Daily ToDs
;
Q:$E(ENT,1)="D"
;
S X=$$ASK2NDTR()
Q:X'="Y" G ^PRSATE4
;
;
HOL ; Determine if Holiday within ToD
N DAY
D ^PRSAPPH
Q:'$D(HOL)
S TT="HX",DUP=1
D E^PRSAPPH K DUP,HOL,TT
Q
;
;
CLEANTOD(PPI,DFN,DAY,TD) ; CLEAN OUT TOUR
N PRSDT,MIEN
K ^PRST(458,PPI,"E",DFN,"D",DAY,1),^(2),^(3),^(10),^(8) I TD<5 K ^(4) S $P(Z,U,13,15)="^^"
; if employee is PTP with active memo then reset the ESR day
S PRSDT=$P($G(^PRST(458,PPI,1)),U,DAY)
S MIEN=$$MIEN^PRSPUT1(DFN,PRSDT)
I MIEN D
. N PRSFDA
. S PRSFDA(458.02,DAY_","_DFN_","_PPI_",",146)="3" ; status = resubmit
. S PRSFDA(458.02,DAY_","_DFN_","_PPI_",",148)="Tour Changed" ; remarks
. D FILE^DIE("","PRSFDA"),MSG^DIALOG()
Q
;
;
ERROR(NUM,VAR1,VAR2) ;
W *7,!!
I NUM=1 W "Employee has no Pay Entitlement table entry."
I NUM=2 D
. Q:$G(NH)=112
. W "Warning: Normal Hours are ",$G(VAR1),"; Tour Hours are ",$G(VAR2)
Q
;
;
ASKFIXED() ;GET USER'S YES OR NO RESPONSE TO FIXED ToD QUESTION
N DIR,DIRUT,Y
S DIR("A")="Do you wish to enter a fixed Mon-Fri Tour"
S DIR(0)="Y"
S DIR("?")="Answer NO to create any other type of tour."
S DIR("?",1)="Fixed tours are Monday - Friday with the same hours."
D ^DIR
Q $S(Y=1:"Y",Y=0:"N",1:"^")
;
;
ASK2NDTR() ;GET USER'S YES OR NO RESPONSE TO 2nd ToD QUESTION
N DIR,DIRUT,Y
S DIR("A")="Do you wish to enter a Second Tour"_$S($G(SRT)="X":"",1:" for any Day")
S DIR(0)="Y"
S DIR("B")="N"
S DIR("?",1)="Answer Yes to add a second tour. No to continue."
S DIR("?")="Enter ^ to escape and cancel this tour change."
D ^DIR
Q $S(Y=1:"Y",Y=0:"N",1:"^")
;
;
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HPRSATE 10454 printed Sep 15, 2024@21:48:32 Page 2
PRSATE ;WCIOFO/JAH/PLT - Enter/Edit Employee (emp) Tour of Duty (ToD) ;03/15/2005
+1 ;;4.0;PAID;**8,11,27,45,55,93,112,117,121,132**;Sep 21, 1995;Build 13
+2 ;;Per VHA Directive 2004-038, this routine should not be modified.
+3 ;
+4 ;ppi=ien of 450, ppi=ien of 458, ppe=pp (yy-mm)
+5 ;tli = ien of t&l, tlu=t&l # (nnn), prstlv=2 for timekeeper user
+6 NEW PPI,PPE,PRSTLV,TLI,TLE,DFN
+7 SET PRSTLV=2
DO ^PRSAUTL
if TLI<1
QUIT
+8 FOR
SET DFN=$$GETEMP^PRSATE6(TLE)
if DFN<1
QUIT
Begin DoDot:1
+9 SET PPI=$PIECE(^PRST(458,0),"^",3)
SET PPE=$PIECE($GET(^PRST(458,PPI,0)),"^",1)
+10 DO TOUREDIT(DFN,PPI,PPE,TLI,TLE,PRSTLV)
End DoDot:1
+11 QUIT
+12 ;
TOUREDIT(DFN,PPI,PPE,TLI,TLE,PRSTLV) ;
+1 NEW C0,NH,FLX,PMP,PP,PB,ENT,SRT,WTL,TYP,Z,TD,ERROR,NOERROR,PRSDAY,PRSETD
+2 NEW PRSTW,PRSTWA,PRSTWB
+3 ;
+4 ; PRSTW: employees telework type
+5 ; PRSTWA: telework eligibilty string
+6 ; PRSTWB: this pay period (PPI) telework eligibilty
+7 ;
+8 ; Entitlement lookup leaks many variables. Following R used in
+9 ; this routine but may be looked up again despite the fact they R
+10 ; leaked by ^PRSAENT. See PRSAENT for further doc.
+11 ;
+12 ;
+13 ; C0=emps 0 node in file 450 NH= emps 8B normal hrs
+14 ; FLX= compressed/flextime code (0=none,C=compressed,F=flextime)
+15 ; PMP= premium pay indicator
+16 ; ( D=entitled Sun., F=entitled Sat./Sun.,
+17 ; E=entitled variable Sat./Sun. premium pay,
+18 ; G=entitled variable Sun. prem pay, X=title 5 emps
+19 ; R,C,O=different types of firefighters)
+20 ; * PP= emps pay plan
+21 ; DB = pay basis-1:full,2:part,3:intermit
+22 ; ENT= 39 char entitlement string
+23 ; Entitlement lookup.
+24 DO ^PRSAENT
IF ENT=""
DO ERROR(1)
SET OUT=1
QUIT
+25 ;
+26 ; Display header/Ask pp (NOL^PRSATE2 returns SRT = Current, Next, Last)
+27 DO NOW^%DTC
SET NOW=%
KILL %
+28 if $EXTRACT(IOST,1,2)="C-"
WRITE @IOF
+29 WRITE !?26,"VA TIME & ATTENDANCE SYSTEM"
+30 WRITE !?29,"EMPLOYEE TOUR OF DUTY"
+31 DO HDR^PRSADP1
DO NOL^PRSATE2
+32 if SRT="^"
QUIT
+33 IF SRT="L"
SET PPI=PPI-1
SET PPE=$PIECE($GET(^PRST(458,PPI,0)),"^",1)
+34 ;
+35 ;get emp's flexitime code, telework ind.
+36 SET FLX=$$FLEXIND^PRSATE6(PPI,DFN,SRT)
SET PRSTWA=$$TWE^PRSATE0(DFN,PPI)
SET PRSTWB=$PIECE(PRSTWA,U,4)="Y"
+37 ;entitled reg. scheduled is o
+38 IF $EXTRACT(ENT,1)="0"
Begin DoDot:1
+39 SET Z=$EXTRACT(ENT,2)
SET TD=$SELECT(Z="D":3,1:4)
DO NONE
End DoDot:1
+40 IF '$TEST
Begin DoDot:1
+41 ;
+42 ; initialize t&l for this ToD
+43 ;
+44 SET WTL=TLI
+45 IF "NL"[SRT
Begin DoDot:2
+46 SET TYP=0
End DoDot:2
+47 IF '$TEST
Begin DoDot:2
+48 SET TYP=$$ISTEMPTR()
+49 ;
+50 ; For temp ToDs--ask user for T&L ToD will be worked
+51 ; Quit if we don't get a valid T&L unit.
+52 ;
+53 IF TYP
SET WTL=$$ASKTLWRK^PRSATE6(TLE)
End DoDot:2
+54 ;
+55 ; Save current ToD in case user aborts with an unacceptable ToD.
+56 ;
+57 DO SAVETOUR^PRSATE6(PPI,DFN)
+58 ;
+59 IF WTL'<1
IF TYP'["^"
Begin DoDot:2
+60 DO A1
+61 ;
+62 ; verify firefighter ToD after compressed ind. edit. Don't accept
+63 ; ToD until its within guidlines. If TK force exits, restore old ToD.
+64 IF PMP="C"
SET NOERROR=0
FOR
Begin DoDot:3
+65 NEW ERROR
DO FFTOUR^PRSATE6(PPI,DFN,SRT,.ERROR)
+66 IF $$ISERRORS^PRSATE6(.ERROR)
Begin DoDot:4
+67 IF $$ASKTOFIX^PRSATE6()
Begin DoDot:5
+68 DO A1
End DoDot:5
+69 IF '$TEST
Begin DoDot:5
+70 DO RESTORE^PRSATE6(PPI,DFN)
SET NOERROR=1
End DoDot:5
End DoDot:4
+71 IF '$TEST
Begin DoDot:4
+72 SET NOERROR=1
End DoDot:4
End DoDot:3
if NOERROR
QUIT
End DoDot:2
End DoDot:1
+73 KILL NOW
QUIT
+74 ;
ISTEMPTR() ; IS TEMPORARY ToD ?
+1 ; Ask user if ToD is temp or perm & convert TYP to true false flag
+2 ; Permanent set TYP=0, Temporary set TYP=true (1)
+3 ;
+4 SET TYP=$$ASKTEMP^PRSATE6()
IF TYP'["^"
SET TYP=$EXTRACT(TYP,1)="T"
SET WTL=TLI
+5 QUIT TYP
+6 ;
A1 ; Set up for emps ToD look up. Screen allows Daily ToDs & days off
+1 ; for daily emps. Everyone else gets days off & all other ToDs.
+2 ; Screen further ensures ToD is available either to all t&ls
+3 ; or to t&l that this emp is working in.
+4 ;
+5 NEW DIC,X,DB
+6 SET DIC="^PRST(457.1,"
SET DIC(0)="AEQMN"
+7 SET DIC("S")="I "_$SELECT($EXTRACT(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)))"
+8 ;
+9 ; Setup a fixed or varying ToD. Compressed ToDs must be varying;
+10 ; ask TK about all others.
+11 ;
+12 SET DB=$PIECE(C0,U,10)
IF FLX="C"!("KM"[PP&(DB=1)&(NH=72))
DO VAR
QUIT
+13 SET X=$$ASKFIXED()
if X="^"
QUIT
IF X="N"
DO VAR
QUIT
+14 IF PRSTWB
SET X=$$ASKTWMF^PRSATE6()
if X="^"
QUIT
IF X="Y"
DO FX
DO VAR
QUIT
+15 DO FX
+16 QUIT
+17 ;
FX ; Fixed ToD
FX1 SET DIC("A")="Select TOUR OF DUTY: "
+1 WRITE !
DO ^DIC
+2 if Y'>0
QUIT
+3 SET TD=+Y
+4 ;check overlap
+5 KILL PRSDAY,PRSETD
+6 FOR DAY=1:1:14
SET $PIECE(PRSETD,U,DAY)=$SELECT(DAY#7<2:1,1:TD)
Begin DoDot:1
+7 NEW TOLD
+8 SET PRSDAY(DAY)=$PIECE($GET(^PRST(458,PPI,"E",DFN,"D",DAY,0)),U,1,4)
SET $PIECE(TOLD,U,DAY)=$SELECT(SRT="N"&($PIECE($GET(^(0)),U,3)):$PIECE(^(0),U,4),1:$PIECE($GET(^(0)),U,2))
if DAY#7>1
SET $PIECE(PRSDAY(DAY),U,6)=$PIECE($GET(^(0)),U,13)
SET $PIECE(PRSDAY(DAY),U,7,999)=$GET(^(4))
+9 DO PRSDAY^PRSATE0
+10 QUIT
End DoDot:1
+11 DO ENT^PRSATE5
IF $GET(PRSERR)
KILL PRSERR
GOTO FX1
+12 SET Y=$GET(^PRST(457.1,TD,1))
SET TDH=$PIECE(^(0),"^",6)
SET HRS=TDH*10
+13 SET (ZENT,STR)=""
+14 DO OT^PRSATP
DO VS^PRSATE0
+15 IF STR'=""
WRITE *7,!!,STR
GOTO FX
+16 IF '$DATA(^PRST(458,PPI,"E",DFN,"D",0))
SET ^(0)="^458.02^14^14"
+17 IF SRT="N"
Begin DoDot:1
+18 DO F1
End DoDot:1
+19 IF '$TEST
Begin DoDot:1
+20 FOR DAY=2:1:6,9:1:13
DO SET
+21 SET TD=1
SET (Y,TDH)=""
FOR DAY=1,7,8,14
DO SET
+22 WRITE " ... done"
if HRS'=NH
DO ERROR(2,NH,HRS)
+23 if 'PRSTWB
DO T2
+24 QUIT
End DoDot:1
+25 IF 'PRSTWB
DO HOL
DO RS
KILL HRS,STR
+26 QUIT
+27 ;
+28 ;
F1 FOR DAY=2:1:6,9:1:13
DO NX
+1 SET TD=1
FOR DAY=1,7,8,14
DO NX
+2 WRITE " ... done"
+3 if HRS'=NH
DO ERROR(2,NH,HRS)
+4 QUIT
+5 ;
VAR ; Variable ToD
+1 DO ^PRSATE0
+2 IF SRT'="N"
DO T2
+3 DO HOL
DO RS
+4 QUIT
+5 ;
NONE ; No ToD
+1 NEW TYP2,UPDT,Y,TDH,PRSTWB
+2 SET PRSTWB=0
+3 WRITE !!,"This is an intermittent employee with no specified tour."
+4 WRITE !!,"Time records will now be updated to indicate this."
+5 IF '$DATA(^PRST(458,PPI,"E",DFN,"D",0))
SET ^(0)="^458.02^14^14"
+6 IF '$$PERM^PRSALIB(PPI,DFN)
Begin DoDot:1
+7 WRITE !!,"Not all tour days are assigned a permanent status."
+8 IF $$UPDTQ^PRSALIB()
IF $$TMPST^PRSALIB(.TYP2)
DO UPDSTAT^PRSALIB(PPI,DFN,TYP2)
End DoDot:1
+9 SET (Y,TDH)=""
SET TYP=0
SET WTL=TLI
+10 IF SRT="N"
Begin DoDot:1
+11 FOR DAY=1:1:14
DO NX
End DoDot:1
+12 IF '$TEST
Begin DoDot:1
+13 FOR DAY=1:1:14
DO SET
End DoDot:1
+14 WRITE " ... done"
+15 DO HOL
DO RS
+16 QUIT
+17 ;
+18 ;
RS ; Get Comp Ind
+1 SET Y=$GET(^PRST(458,PPI,"E",DFN,0))
+2 SET FLX=$SELECT((SRT="N")&($PIECE(Y,U,7)]""):$PIECE(Y,U,7),1:$PIECE(Y,U,6))
+3 SET DIR(0)="SAM^C:Compressed;F:Flexitime;0:None"
+4 SET DIR("A")="Compressed Tour Indicator: "
+5 SET DIR("B")=$SELECT(FLX="C":"Compressed",FLX="F":"Flexitime",1:"None")
+6 DO ^DIR
KILL DIR
IF "^C^F^0^"'[(U_Y_U)
SET Y=FLX
+7 ;
+8 ; Intermittent employee cannot have compressed tour.
+9 ;
+10 IF $PIECE(C0,U,10)=3
IF Y="C"
Begin DoDot:1
+11 WRITE *7,!?5,"Compressed tour not valid for this employee."
End DoDot:1
GOTO RS
+12 ;
+13 IF Y="F"
SET Z=0
Begin DoDot:1
+14 SET PAY=$PIECE(C0,U,21)
SET PB=$PIECE(C0,U,20)
+15 IF "0123456789GU"'[PAY
SET Z=1
+16 IF PAY="G"
IF PB'=2
SET Z=1
+17 IF PAY="U"
IF "27EXT"'[PB
SET Z=1
+18 IF Z
WRITE *7,!?5,"Flexitime not valid for this employee."
+19 QUIT
End DoDot:1
IF Z
GOTO RS
+20 SET $PIECE(^PRST(458,PPI,"E",DFN,0),U,$SELECT(SRT="N":7,1:6))=Y
+21 IF $DATA(^PRST(458,"ATC",DFN))
DO UPD^PRSASAL
+22 KILL PAY,ZENT
QUIT
+23 ;
+24 ;
NX ; Set Next ToD
+1 SET Z=$GET(^PRST(458,PPI,"E",DFN,"D",DAY,0))
+2 IF $PIECE(Z,"^",2)=TD
IF '$PIECE(Z,"^",3)
IF 'PRSTWB!($PIECE($GET(^PRST(458,PPI,"E",DFN,"D",DAY,8)),U)=$GET(PRSTW(DAY)))
QUIT
+3 SET $PIECE(Z,"^",3,4)="2^"_TD
SET $PIECE(Z,"^",10,11)=DUZ_"^"_NOW
+4 SET ^PRST(458,PPI,"E",DFN,"D",DAY,0)=Z
if PRSTWB
SET $PIECE(^(8),U,5)=$GET(PRSTW(DAY))
+5 SET ^PRST(458,"ATC",DFN,PPI,DAY)=""
+6 QUIT
+7 ;
+8 ;
SET ; Set ToD
+1 NEW ZLASTPP,OLD,SCH,PRSTW1,PRSTW5
+2 ;get Zero node of emp pp rec, Old ToD, & Prior scheduled ToD.
+3 ;ZLASTPP is true if a ToD present on this day last pp.
+4 SET Z=$GET(^PRST(458,PPI,"E",DFN,"D",DAY,0))
SET PRSTW1=$PIECE($GET(^(8)),U)
SET PRSTW5=$PIECE($GET(^(8)),U,5)
SET OLD=$PIECE(Z,U,2)
SET SCH=$PIECE(Z,U,4)
+5 SET ZLASTPP=$PIECE($GET(^PRST(458,PPI-1,"E",DFN,"D",DAY,0)),U,2)'=""
+6 ;quit if old tour and its time segments/telework tour=edited one
+7 IF OLD=TD
IF $GET(^PRST(458,PPI,"E",DFN,"D",DAY,1))=Y
IF PRSTW1=$GET(PRSTW(DAY))!'$GET(PRSTWB)
QUIT
+8 ;Z is updated with new ToD info & replaces the emp ToD record.
+9 SET $PIECE(Z,U,8)=TDH
SET $PIECE(Z,U,10,11)=DUZ_U_NOW
+10 ; remove holiday flag
IF $PIECE(Z,U,12)
SET $PIECE(Z,U,12)=""
+11 ;Temp ToD, store T&L ToD will be worked if it's not emp's usual t&l.
+12 IF TYP
IF TLI'=WTL
SET $PIECE(Z,U,9)=WTL
+13 ;no existing ToD on this day.
+14 IF OLD=""
SET $PIECE(Z,U,1,3)=DAY_U_TD_U_TYP
if ZLASTPP
DO S0
DO S1
if $GET(PRSTWB)
DO S8($GET(PRSTW(DAY)),1)
QUIT
+15 ;clean out postings and other ToD info since ToD is changing
+16 DO CLEANTOD(PPI,DFN,DAY,TD)
+17 IF SCH=""
SET $PIECE(Z,U,2,4)=TD_U_TYP_U_OLD
DO S0
DO S1
if $GET(PRSTWB)
DO S8($GET(PRSTW(DAY)),1)
DO S8(PRSTW1,5)
QUIT
+18 SET $PIECE(Z,U,5,7)="^^"
+19 IF SCH=TD
IF PRSTW5=$GET(PRSTW(DAY))!'$GET(PRSTWB)
SET $PIECE(Z,U,2,4)=TD_"^^"
KILL ^PRST(458,"ATC",DFN,PPI,DAY)
DO S1
if $GET(PRSTWB)
DO S8("",5)
DO S8($GET(PRSTW(DAY)),1)
QUIT
+20 SET $PIECE(Z,U,2,3)=TD_U_TYP
DO S0
DO S1
if $GET(PRSTWB)
DO S8($GET(PRSTW(DAY)),1)
+21 QUIT
+22 ;
+23 ;
+24 ; Set up x-ref for supervisor approval of ToD change
+25 ;
S0 SET ^PRST(458,"ATC",DFN,PPI,DAY)=""
+1 QUIT
+2 ;
+3 ;
S1 ;
+1 SET ^PRST(458,PPI,"E",DFN,"D",DAY,0)=Z
if Y'=""
SET ^(1)=Y
+2 QUIT
+3 ;
+4 ;a=telework tour reg/med, b=1 if reg/temp tour, 5 if prior/next tour
S8(A,B) ;set telework tour in node 8 of daily multiple
+1 ;prstwb=1 telework eligible
+2 IF '$GET(PRSTWB)
KILL ^PRST(458,PPI,"E",DFN,"D",DAY,8)
QUIT
+3 SET $PIECE(^PRST(458,PPI,"E",DFN,"D",DAY,8),U,B)=A
+4 ; if no telework data then clean up
+5 IF ^PRST(458,PPI,"E",DFN,"D",DAY,8)?."^"
KILL ^PRST(458,PPI,"E",DFN,"D",DAY,8)
+6 QUIT
+7 ;
+8 ;
T2 ; Ask if second ToD
+1 NEW X
+2 ;
+3 ; Don't ask for Daily ToDs
+4 ;
+5 if $EXTRACT(ENT,1)="D"
QUIT
+6 ;
+7 SET X=$$ASK2NDTR()
+8 if X'="Y"
QUIT
GOTO ^PRSATE4
+9 ;
+10 ;
HOL ; Determine if Holiday within ToD
+1 NEW DAY
+2 DO ^PRSAPPH
+3 if '$DATA(HOL)
QUIT
+4 SET TT="HX"
SET DUP=1
+5 DO E^PRSAPPH
KILL DUP,HOL,TT
+6 QUIT
+7 ;
+8 ;
CLEANTOD(PPI,DFN,DAY,TD) ; CLEAN OUT TOUR
+1 NEW PRSDT,MIEN
+2 KILL ^PRST(458,PPI,"E",DFN,"D",DAY,1),^(2),^(3),^(10),^(8)
IF TD<5
KILL ^(4)
SET $PIECE(Z,U,13,15)="^^"
+3 ; if employee is PTP with active memo then reset the ESR day
+4 SET PRSDT=$PIECE($GET(^PRST(458,PPI,1)),U,DAY)
+5 SET MIEN=$$MIEN^PRSPUT1(DFN,PRSDT)
+6 IF MIEN
Begin DoDot:1
+7 NEW PRSFDA
+8 ; status = resubmit
SET PRSFDA(458.02,DAY_","_DFN_","_PPI_",",146)="3"
+9 ; remarks
SET PRSFDA(458.02,DAY_","_DFN_","_PPI_",",148)="Tour Changed"
+10 DO FILE^DIE("","PRSFDA")
DO MSG^DIALOG()
End DoDot:1
+11 QUIT
+12 ;
+13 ;
ERROR(NUM,VAR1,VAR2) ;
+1 WRITE *7,!!
+2 IF NUM=1
WRITE "Employee has no Pay Entitlement table entry."
+3 IF NUM=2
Begin DoDot:1
+4 if $GET(NH)=112
QUIT
+5 WRITE "Warning: Normal Hours are ",$GET(VAR1),"; Tour Hours are ",$GET(VAR2)
End DoDot:1
+6 QUIT
+7 ;
+8 ;
ASKFIXED() ;GET USER'S YES OR NO RESPONSE TO FIXED ToD QUESTION
+1 NEW DIR,DIRUT,Y
+2 SET DIR("A")="Do you wish to enter a fixed Mon-Fri Tour"
+3 SET DIR(0)="Y"
+4 SET DIR("?")="Answer NO to create any other type of tour."
+5 SET DIR("?",1)="Fixed tours are Monday - Friday with the same hours."
+6 DO ^DIR
+7 QUIT $SELECT(Y=1:"Y",Y=0:"N",1:"^")
+8 ;
+9 ;
ASK2NDTR() ;GET USER'S YES OR NO RESPONSE TO 2nd ToD QUESTION
+1 NEW DIR,DIRUT,Y
+2 SET DIR("A")="Do you wish to enter a Second Tour"_$SELECT($GET(SRT)="X":"",1:" for any Day")
+3 SET DIR(0)="Y"
+4 SET DIR("B")="N"
+5 SET DIR("?",1)="Answer Yes to add a second tour. No to continue."
+6 SET DIR("?")="Enter ^ to escape and cancel this tour change."
+7 DO ^DIR
+8 QUIT $SELECT(Y=1:"Y",Y=0:"N",1:"^")
+9 ;
+10 ;