| 1 | PRSATP5 ;HISC/MGD-Timekeeper Post Absence ;04/18/06 | 
|---|
| 2 | ;;4.0;PAID;**102,108**;Sep 21, 1995 | 
|---|
| 3 | ; | 
|---|
| 4 | CNV96(TDATA,NSEG,ARRAY,ZERO,DADRFM) ; | 
|---|
| 5 | ; Convert the external representation of the start/stop time to | 
|---|
| 6 | ; its 1 - 192 piece equivalent | 
|---|
| 7 | ; | 
|---|
| 8 | ; Input: | 
|---|
| 9 | ;       TDATA - Time segments to operate on passed by reference | 
|---|
| 10 | ;        NSEG - Number of Segments per start/stop time entry | 
|---|
| 11 | ;                       3 for tours, 4 for exceptions | 
|---|
| 12 | ;       ARRAY - Name of ordered array to create | 
|---|
| 13 | ;       1st char - P = Prior (to holiday) | 
|---|
| 14 | ;                  H = Holiday | 
|---|
| 15 | ;                  N = Next day after holiday | 
|---|
| 16 | ;       2nd char - T = Tour segments | 
|---|
| 17 | ;                  E = Exception segments, does not include segments | 
|---|
| 18 | ;                      that define periods of On-Call | 
|---|
| 19 | ;                  O = Segments that define periods of On-Call | 
|---|
| 20 | ;                      Could have come from Tour(s) or Exceptions | 
|---|
| 21 | ;                  C = Segments of work performed during periods | 
|---|
| 22 | ;                      of On-Call | 
|---|
| 23 | ;       Format for all arrays | 
|---|
| 24 | ;         ARRAY(START)=START^STOP^TOT | 
|---|
| 25 | ;         Note: Exceptions arrays (PE, HE, NE) will contain the | 
|---|
| 26 | ;               Remarks Code as the 4th piece of DATA | 
|---|
| 27 | ;               Exceptions(START)=START^STOP^TOT^RC | 
|---|
| 28 | ; | 
|---|
| 29 | ;        ZERO - 0 node of day being processed | 
|---|
| 30 | ; | 
|---|
| 31 | ;        DADRFM - variable needed for tracking of tours that | 
|---|
| 32 | ;                 cross midnight.  Passed by reference and may | 
|---|
| 33 | ;                 be changed. | 
|---|
| 34 | ; | 
|---|
| 35 | Q:TDATA="" | 
|---|
| 36 | N D,FLAG,K,LAST,K1,N,N1,N14,NDAY,QT,V,X,Y,Y1,Z | 
|---|
| 37 | S N=$S(NSEG=4:2,1:1) | 
|---|
| 38 | D CNV,COA | 
|---|
| 39 | Q | 
|---|
| 40 | ; | 
|---|
| 41 | ; The CNV code was copied from PRS8SU and modified to fit | 
|---|
| 42 | ; out needs | 
|---|
| 43 | ; | 
|---|
| 44 | ; loop thru data nodes for day | 
|---|
| 45 | CNV S D(0)=ZERO,Z=TDATA,N1=NSEG,(N14,NDAY,LAST,QT)=0 | 
|---|
| 46 | ; | 
|---|
| 47 | ; process tour and work nodes by looping thru postings in the node | 
|---|
| 48 | F K=1:N1 S V=$P(Z,"^",K,K+1) Q:QT  D | 
|---|
| 49 | .S X=$P(Z,U,K,999) | 
|---|
| 50 | .S:X?1"^"."^"!(X="")!(N14=1) QT=1 | 
|---|
| 51 | .I QT!($P(Z,U,K)="") Q | 
|---|
| 52 | .; | 
|---|
| 53 | .S:K=1 (NDAY,LAST)=0 | 
|---|
| 54 | .; | 
|---|
| 55 | .; process start time and stop time for posting in node | 
|---|
| 56 | .F K1=1,2 S X=$P(V,"^",K1),(Y,Y1)=K1-1 I X'="" D | 
|---|
| 57 | ..; | 
|---|
| 58 | ..; when a tour exception (N=2) start time (K1=1) is being processed | 
|---|
| 59 | ..; determine if LAST should be reset (FLAG). If LAST is reset then | 
|---|
| 60 | ..; the start time of the tour exception will initially be placed | 
|---|
| 61 | ..; in the current day (X'>96) instead of the following day (X>96) | 
|---|
| 62 | ..S FLAG=1 | 
|---|
| 63 | ..I N=2&(K1=1)&("^HW^"[("^"_$P(Z,"^",K+2)_"^")) D | 
|---|
| 64 | ...S FLAG=$S(NDAY=1!(LAST>96)&("^HW^"[("^"_$P(Z,"^",K+2)_"^"))&((X["A")!(X["MID")):0,1:1),NDAY=0 | 
|---|
| 65 | ..S:$P(D(0),"^",14)'=""&(X="MID")&(LAST=96)&(N=2)&(K1=1) FLAG=0 | 
|---|
| 66 | ..S:N=2&(K1=1)&(FLAG=1) (NDAY,LAST)=0 | 
|---|
| 67 | ..; | 
|---|
| 68 | ..S Y=K1-1 D 15^PRS8SU ; determine number (1-192) corresponding to time | 
|---|
| 69 | ..; | 
|---|
| 70 | ..; if some tour exceptions (such as leave) are not within a sched. | 
|---|
| 71 | ..; tour then they must be for the following day (i.e. 2-day tour) | 
|---|
| 72 | ..I N=2,"^RG^OT^CT^ON^SB^HW^"'[("^"_$P(Z,"^",K+2)_"^") D | 
|---|
| 73 | ...S Y=+$O(DADRFM("S",(-X-.01))),Y1=+$O(DADRFM("F",(X-.01))) | 
|---|
| 74 | ...I $G(DADRFM("S",Y))'=$G(DADRFM("F",Y1)) S X=X+96 | 
|---|
| 75 | ...; | 
|---|
| 76 | ..S $P(Z,"^",K+(K1-1))=X ; replace time by number | 
|---|
| 77 | ..; | 
|---|
| 78 | ..; save scheduled tour start and stop times for later use when | 
|---|
| 79 | ..; placing some tour exceptions on correct day for 2-day tours | 
|---|
| 80 | ..I K1=1,N=1!(N=4) S DADRFM("S",-X)=DADRFM | 
|---|
| 81 | ..I K1=2,N=1!(N=4) S DADRFM("F",X)=DADRFM,DADRFM=DADRFM+1 | 
|---|
| 82 | ..; | 
|---|
| 83 | ..; End of code copied from PRS8SU | 
|---|
| 84 | ..S $P(TDATA,U,K+(K1-1))=X | 
|---|
| 85 | Q | 
|---|
| 86 | ; | 
|---|
| 87 | ; Create ordered arrays | 
|---|
| 88 | COA N ARY,RC,SEG,STI,STOP,STRT,TOT | 
|---|
| 89 | S RC="" | 
|---|
| 90 | F SEG=0:1:6 D | 
|---|
| 91 | .S STRT=$P(TDATA,U,(SEG*NSEG)+1) | 
|---|
| 92 | .Q:STRT="" | 
|---|
| 93 | .S STOP=$P(TDATA,U,(SEG*NSEG)+2),TOT=$P(TDATA,U,(SEG*NSEG)+3) | 
|---|
| 94 | .; For Node1 & Node4 TOT will be numeric so we will need to get | 
|---|
| 95 | .; its external representation (2 character string) | 
|---|
| 96 | .; For Node2 TOT will be a 2 character string | 
|---|
| 97 | .I NSEG=4 S RC=$P(TDATA,U,(SEG*NSEG)+4) | 
|---|
| 98 | .S STI="" ; Special Tour Indicator | 
|---|
| 99 | .I NSEG=3,TOT S STI=$P($G(^PRST(457.2,TOT,0)),U,2) | 
|---|
| 100 | .; | 
|---|
| 101 | .; Don't set exceptions defining periods of On-Call into Exception array | 
|---|
| 102 | .I $E(ARRAY,2)="E",TOT'="ON" D | 
|---|
| 103 | ..S @ARRAY@(STRT)=STRT_U_STOP_U_TOT_U_RC | 
|---|
| 104 | .; | 
|---|
| 105 | .; Set only Reg segments of tour where the Special Tour Indicator | 
|---|
| 106 | .; is "" or RG into the Tour array | 
|---|
| 107 | .I $E(ARRAY,2)="T" D | 
|---|
| 108 | ..I TOT="" S @ARRAY@(STRT)=STRT_U_STOP_U_TOT | 
|---|
| 109 | ..I STI="RG" S @ARRAY@(STRT)=STRT_U_STOP_U_TOT | 
|---|
| 110 | .; | 
|---|
| 111 | .; Only set segments that define On-Call into On-Call array | 
|---|
| 112 | .I TOT="ON"!(STI="ON") D | 
|---|
| 113 | ..S TOT=$S(TOT'="":TOT,1:STI) | 
|---|
| 114 | ..S ARY=$E(ARRAY,1)_"O" S @ARY@(STRT)=STRT_U_STOP_U_TOT | 
|---|
| 115 | .; | 
|---|
| 116 | .; Only segments of work get in the Call-Back | 
|---|
| 117 | .I "^RG^OT^CT^"[("^"_TOT_"^") D | 
|---|
| 118 | .. S ARY=$E(ARRAY,1)_"C" S @ARY@(STRT)=STRT_U_STOP_U_TOT | 
|---|
| 119 | Q | 
|---|
| 120 | ; | 
|---|
| 121 | GETPPP(PPIP,DFN,WDAY,BACK,QUIT) ; | 
|---|
| 122 | ; Set appropriate variables for prior pay period | 
|---|
| 123 | ;   Input: | 
|---|
| 124 | ;     PPIP - Internal format of current pay period | 
|---|
| 125 | ;      DFN - IEN of employee | 
|---|
| 126 | ;     WDAY - Day currently being examined | 
|---|
| 127 | ;     QUIT - Null | 
|---|
| 128 | ; | 
|---|
| 129 | ;  Output: | 
|---|
| 130 | ;     PPIP - IEN of Prior Pay Period | 
|---|
| 131 | ;     WDAY - Set to last day of prior pay period | 
|---|
| 132 | ;     BACK - Counter for number of pay period looked back | 
|---|
| 133 | ;     QUIT - Will be set to 1 if there is no timecard for | 
|---|
| 134 | ;            the employee in the prior pay period | 
|---|
| 135 | ; | 
|---|
| 136 | S PPIP=$O(^PRST(458,PPIP),-1) ; Get Prior PP | 
|---|
| 137 | I 'PPIP S QUIT=1 Q  ; No prior pay period on file | 
|---|
| 138 | ; Check for employee timecard in this PP | 
|---|
| 139 | I '$D(^PRST(458,PPIP,"E",DFN,0)) S QUIT=1 Q | 
|---|
| 140 | S WDAY=14,BACK=BACK+1 | 
|---|
| 141 | Q | 
|---|
| 142 | ; | 
|---|
| 143 | GETNPP(PPIN,DFN,WDAY,NEXT,QUIT) ; | 
|---|
| 144 | ; Set appropriate variables for next pay period | 
|---|
| 145 | ;   Input: | 
|---|
| 146 | ;     PPIN - Internal format of current pay period | 
|---|
| 147 | ;      DFN - IEN of employee | 
|---|
| 148 | ;     WDAY - Day currently being examined | 
|---|
| 149 | ;     QUIT - Null | 
|---|
| 150 | ; | 
|---|
| 151 | ;  Output: | 
|---|
| 152 | ;     PPIN - IEN of Next Pay Period | 
|---|
| 153 | ;     WDAY - Set to first day of next pay period | 
|---|
| 154 | ;     BACK - Counter for number of pay period looked forward | 
|---|
| 155 | ;     QUIT - Will be set to 1 if there is no timecard for | 
|---|
| 156 | ;            the employee in the next pay period | 
|---|
| 157 | ; | 
|---|
| 158 | S PPIN=$O(^PRST(458,PPIN)) ; Get next PP | 
|---|
| 159 | I 'PPIN S QUIT=1 Q  ; Next pay period not on file | 
|---|
| 160 | ; Check for employee timecard in this PP | 
|---|
| 161 | I '$D(^PRST(458,PPIN,"E",DFN,0)) S QUIT=1 Q | 
|---|
| 162 | S WDAY=1,NEXT=NEXT+1 | 
|---|
| 163 | Q | 
|---|