PRSATE ;WCIOFO/JAH - Enter/Edit Employee (emp) Tour of Duty (ToD) ;03/15/2005
 ;;4.0;PAID;**8,11,27,45,55,93**;Sep 21, 1995;Build 7
 ;;Per VHA Directive 2004-038, this routine should not be modified.
 N PPI,PPE,PRSTLV,TLI,TLE,DFN
 ;
 ;    PPI =  pay period (pp) internal #.
 ;    PPE = pp external form (99-06).
 ;    PRSTLV = flag indicates timekeeper (TK) in T&L lookup ^PRSAUTL.
 ;    TLI = T&L unit internal #.
 ;    TLU = T&L unit # 3-digit
 ;
 ;  -Get current pp-internal & external.  -Ask user for T&L.
 ;  -Loop to ask for emp until TK is done.
 ;  --Emp lookup screens emps not in T&L returned by PRSAUTL call.
 ;
 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
 ;
 ;   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=%
 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
 ;
 S FLX=$$FLEXIND^PRSATE6(PPI,DFN,SRT)
 ;
 ;  Is emp entitled reg. shed. hrs.?
 ;
 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.
 ..;
 ..  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
 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
 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.
 ;
 I FLX="C" D
 .   D VAR
 E  D
 .  S X=$$ASKFIXED()
 .  Q:X="^"
 .  I X="N" D
 ..    D VAR
 .  E  D FX
 Q
 ;=======================
 ;
FX ; Fixed ToD
 S DIC("A")="Select TOUR OF DUTY: "
 W ! D ^DIC
 Q:Y'>0
 S TD=+Y,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 T2,^PRSATE5
 D HOL,RS
 Q
 ;=======================
 ;
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)
 Q
 ;=======================
 ;
VAR ; Variable ToD
 D ^PRSATE0
 I SRT'="N" D T2,^PRSATE5
 D HOL,RS
 Q
 ;=======================
 ;
NONE ; No ToD
 N TYP2,UPDT,Y,TDH
 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
 Q
 ;=======================
 ;
NX ; Set Next ToD
 S Z=$G(^PRST(458,PPI,"E",DFN,"D",DAY,0))
 Q:$P(Z,"^",2)=TD&('$P(Z,"^",3))
 ;
 S $P(Z,"^",3,4)="2^"_TD,$P(Z,"^",10,11)=DUZ_"^"_NOW
 S ^PRST(458,PPI,"E",DFN,"D",DAY,0)=Z,^PRST(458,"ATC",DFN,PPI,DAY)=""
 Q
 ;=======================
 ;
SET ; Set ToD
 N ZLASTPP
 S U="^"
 ;
 ; 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))
 S ZLASTPP=$P($G(^PRST(458,PPI-1,"E",DFN,"D",DAY,0)),U,2)'=""
 S OLD=$P(Z,U,2),SCH=$P(Z,U,4)
 ;
 ; Quit if old ToD=this ToD & emp rec start/stop=ToD file start/stop.
 ;
 Q:(OLD=TD)&($G(^PRST(458,PPI,"E",DFN,"D",DAY,1))=Y)
 ;
 ; Z is updated with new ToD info & replaces the emp ToD record.
 ;
 S $P(Z,U,8)=TDH
 S $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 S:TLI'=WTL $P(Z,U,9)=WTL
 ;
 ; No existing ToD on this day.
 ;
 I OLD="" D
 .  S $P(Z,U,1,3)=DAY_U_TD_U_TYP
 .  I ZLASTPP D S0
 E  D
 .;
 .;  clean out postings and other ToD info since ToD is changing
 .;
 .  D CLEANTOD(PPI,DFN,DAY,TD)
 .;
 .;
 .;
 .  S:SCH $P(Z,U,5,7)="^^"
 .  I SCH="" D
 ..    S $P(Z,U,2,4)=TD_U_TYP_U_OLD
 ..    D S0
 .  E  D
 ..    I SCH=TD D
 ...      S $P(Z,U,2,4)=TD_"^^"
 ...      K ^PRST(458,"ATC",DFN,PPI,DAY)
 ..    E  D
 ...      S $P(Z,U,2,3)=TD_U_TYP
 ...      D S0
 ;
 D S1
 Q
 ;=======================
 ;
 ; 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
 ;=======================
 ;
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
 Q
 ;=======================
 ;
CLEANTOD(PPI,DFN,DAY,TD) ; CLEAN OUT TOUR
 N PRSDT,MIEN
 K ^PRST(458,PPI,"E",DFN,"D",DAY,1),^(2),^(3),^(10) 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
 S RESP=$S(Y=1:"Y",Y=0:"N",1:"^")
 Q RESP
 ;=======================
 ;
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 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
 S RESP=$S(Y=1:"Y",Y=0:"N",1:"^")
 Q RESP
 ;=======================
 ;
