| 1 | PRSAPPU ; HISC/REL,WIRMFO/JAH - Calculate Pay Period; 22-JAN-1998 | 
|---|
| 2 | ;;4.0;PAID;**19,22,35**;Sep 21, 1995 | 
|---|
| 3 | ;==================================================================== | 
|---|
| 4 | PP ;Calculate Pay Period from a FileMan date. | 
|---|
| 5 | ; | 
|---|
| 6 | ; Input :  D1 = FileMan Date | 
|---|
| 7 | ; Output : D1 - unchanged | 
|---|
| 8 | ;          PPI = internal entry of pay period if available else undef. | 
|---|
| 9 | ;          PPE = Pay period that D1 falls in, formatted yy-pp. | 
|---|
| 10 | ;          PP4Y = Pay period with 4 digit year: yyyy-pp. | 
|---|
| 11 | ;          DAY = Day # of D1 within PPE | 
|---|
| 12 | ; | 
|---|
| 13 | ;   1.  Get 1st day of leave year (X2) that the date D1 falls in. | 
|---|
| 14 | ;   2.  Reserve 2 and 4 digit year to build pay period. | 
|---|
| 15 | ;   3.  Find # of days between 1st day & D1 and divide by 14 | 
|---|
| 16 | ;       to determine pay period #.  Mod to find day w/in pp. | 
|---|
| 17 | ;   4.  Build Pay period with year and pay period #. | 
|---|
| 18 | ; | 
|---|
| 19 | N Y,K,X1,X2,X | 
|---|
| 20 | ; | 
|---|
| 21 | S Y=$P($T(DAT),";;",2) | 
|---|
| 22 | F K=1:1:23 Q:D1<$P(Y,",",K) | 
|---|
| 23 | S X2=$P(Y,",",K-1) | 
|---|
| 24 | ; | 
|---|
| 25 | S PPE=$E(X2,2,3),PP4Y=$E(X2,1,3)+1700 | 
|---|
| 26 | ; | 
|---|
| 27 | S X1=D1 | 
|---|
| 28 | D ^%DTC | 
|---|
| 29 | S Y=X\14+1,DAY=X#14+1 | 
|---|
| 30 | ; | 
|---|
| 31 | S PPE=PPE_"-"_$S(Y<10:"0"_Y,1:Y) | 
|---|
| 32 | S PPI=$O(^PRST(458,"B",PPE,0)) | 
|---|
| 33 | S PP4Y=PP4Y_"-"_$P(PPE,"-",2) | 
|---|
| 34 | ; | 
|---|
| 35 | Q | 
|---|
| 36 | ;==================================================================== | 
|---|
| 37 | NX ; Calculate Date of 1st day of Pay Period. | 
|---|
| 38 | ; | 
|---|
| 39 | ; INPUT:   PPE = Pay Period formatted YY-PP. | 
|---|
| 40 | ; OUTPUT:  D1 = FileMan Date of 1st day of pay period. | 
|---|
| 41 | ; | 
|---|
| 42 | N Y,K,X1,X2 | 
|---|
| 43 | ; | 
|---|
| 44 | S Y=$P($T(DAT),";;",2) | 
|---|
| 45 | F K=1:1:23 Q:$E($P(Y,",",K),2,3)=$E(PPE,1,2) | 
|---|
| 46 | S X1=$P(Y,",",K),X2=14*($E(PPE,4,5)-1) D C^%DTC | 
|---|
| 47 | S D1=X Q | 
|---|
| 48 | ;==================================================================== | 
|---|
| 49 | DTP ; Printable Date | 
|---|
| 50 | S %=X,Y=$J(+$E(X,6,7),2)_"-"_$P("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec"," ",+$E(X,4,5))_"-"_$E(X,2,3) | 
|---|
| 51 | K % Q | 
|---|
| 52 | ;==================================================================== | 
|---|
| 53 | ;These FileMan dates correspond to 1st day of pay period #1 | 
|---|
| 54 | ;of respective years. | 
|---|
| 55 | ; | 
|---|
| 56 | DAT ;;2910113,2920112,2930110,2940109,2950108,2960107,2970105,2980104,2990103,3000102,3010114,3020113,3030112,3040111,3050109,3060108,3070107,3080106,3090104,3100103,3110102,3120101,3130113 | 
|---|
| 57 | ; | 
|---|
| 58 | ;==================================================================== | 
|---|
| 59 | PREP(CURP) ;given a pay period, return the previous pay period. | 
|---|
| 60 | ;  WARNING: This call only valid for years that are in the seed | 
|---|
| 61 | ;           range of the FileMan dates on the DAT^PRSAPPU line. | 
|---|
| 62 | ;           If pay period passed is out of this range then | 
|---|
| 63 | ;           0 is returned. | 
|---|
| 64 | ; | 
|---|
| 65 | ;Input:   CURP =  Pay period, passed in format YY-PP or YYYY-PP | 
|---|
| 66 | ;Output:  function returns previous pay period in YYYY-PP format. | 
|---|
| 67 | ; | 
|---|
| 68 | N PPE,PPI,D1,DAY,INYR,RANGE,FIRSTPP,INPP | 
|---|
| 69 | ; | 
|---|
| 70 | ;validate input - pay period and year | 
|---|
| 71 | ; | 
|---|
| 72 | Q:'$$VALIDPP(CURP) 0 | 
|---|
| 73 | S INPP=$P(CURP,"-",2) | 
|---|
| 74 | S INYR=$P(CURP,"-") | 
|---|
| 75 | S INYR=$E(INYR,$L(INYR)-1,$L(INYR)) | 
|---|
| 76 | S PPE=INYR_"-"_INPP | 
|---|
| 77 | ; | 
|---|
| 78 | ; Handle special case of 1ST PAY PERIOD iN the VALID RANGE | 
|---|
| 79 | S RANGE=$P($T(DAT),";;",2) | 
|---|
| 80 | S FIRSTPP=$E($P(RANGE,","),2,3)_"-01" | 
|---|
| 81 | Q:(PPE=FIRSTPP) $E($P(RANGE,","),1,3)+1700_"-26" | 
|---|
| 82 | ; | 
|---|
| 83 | ;Get 1st date of input pay period. | 
|---|
| 84 | ; | 
|---|
| 85 | D NX | 
|---|
| 86 | ; | 
|---|
| 87 | ;Subtract 14 days from current to get 1st day of previous pay period. | 
|---|
| 88 | S X1=D1,X2=-14 D C^%DTC S D1=X | 
|---|
| 89 | D PP | 
|---|
| 90 | Q PP4Y | 
|---|
| 91 | ; | 
|---|
| 92 | ;==================================================================== | 
|---|
| 93 | NXTPP(CURP) ;given a payperiod, return the NEXT payperiod. YYYY-PP | 
|---|
| 94 | ;  WARNING: This call only valid for years that are in the seed | 
|---|
| 95 | ;           range of the FileMan dates on the DAT^PRSAPPU line. | 
|---|
| 96 | ;           If pay period passed is out of this range then | 
|---|
| 97 | ;           0 is returned. | 
|---|
| 98 | ; | 
|---|
| 99 | ;Input:   CURP =  Pay period, passed in format YY-PP or YYYY-PP | 
|---|
| 100 | ;Output:  function returns previous pay period in YYYY-PP format. | 
|---|
| 101 | ; | 
|---|
| 102 | N PPE,PPI,D1,X1,X2,INPP,INYR,D1 | 
|---|
| 103 | ; | 
|---|
| 104 | Q:'$$VALIDPP(CURP) 0 | 
|---|
| 105 | ; | 
|---|
| 106 | ;Get 1st date of current pay period. | 
|---|
| 107 | S INPP=$P(CURP,"-",2) | 
|---|
| 108 | S INYR=$P(CURP,"-") | 
|---|
| 109 | S INYR=$E(INYR,$L(INYR)-1,$L(INYR)) | 
|---|
| 110 | S PPE=INYR_"-"_INPP | 
|---|
| 111 | D NX | 
|---|
| 112 | ; | 
|---|
| 113 | ;Add 14 days to current to get 1st day of next pay period. | 
|---|
| 114 | S X1=D1,X2=14 D C^%DTC S D1=X | 
|---|
| 115 | D PP | 
|---|
| 116 | Q PP4Y | 
|---|
| 117 | ;==================================================================== | 
|---|
| 118 | VALIDPP(PP) ;Valid pay period must be in form YY-PP or YYYY-PP where | 
|---|
| 119 | ;        pp is pay periods 01-26 and | 
|---|
| 120 | ;        yy or yyyy are years in the FileMan dates at DAT^PRSAPPU | 
|---|
| 121 | ; | 
|---|
| 122 | N VALID,INVALID,VALYRS,RANGE,INCR,INPP,INYR,TESTYR | 
|---|
| 123 | S VALID=1,INVALID=0 | 
|---|
| 124 | ; | 
|---|
| 125 | ;validate input - year and pay period | 
|---|
| 126 | ; | 
|---|
| 127 | S VALYRS="," | 
|---|
| 128 | S RANGE=$P($T(DAT),";;",2) | 
|---|
| 129 | F INCR=1:1:$L(RANGE,",") S VALYRS=VALYRS_$E($P(RANGE,",",INCR),2,3)_"," | 
|---|
| 130 | S INYR=$P(PP,"-") | 
|---|
| 131 | I '(($L(INYR)=2)!($L(INYR)=4)) Q INVALID | 
|---|
| 132 | S INYR=$E(INYR,$L(INYR)-1,$L(INYR)) | 
|---|
| 133 | S TESTYR=","_INYR_"," | 
|---|
| 134 | I VALYRS'[TESTYR Q INVALID | 
|---|
| 135 | ; | 
|---|
| 136 | S INPP=$P(PP,"-",2) | 
|---|
| 137 | ; | 
|---|
| 138 | S VALPPS=",01,02,03,04,05,06,07,08,09," | 
|---|
| 139 | S TESTINPP=","_INPP_"," | 
|---|
| 140 | I '((VALPPS[TESTINPP)!((INPP>9)&(INPP<28))) Q INVALID | 
|---|
| 141 | ; | 
|---|
| 142 | ; pay period 27 is not always valid. | 
|---|
| 143 | ; | 
|---|
| 144 | I INPP=27 I $P($$NXTPP(INYR_"-26"),"-",2)'=27 Q INVALID | 
|---|
| 145 | Q VALID | 
|---|
| 146 | ; | 
|---|
| 147 | ;==================================================================== | 
|---|
| 148 | PPRANGE(STARTPP,ENDPP,STPP4Y,ENDPP4Y) ;get a pay period range from input. | 
|---|
| 149 | ;  INPUT: none | 
|---|
| 150 | ;  OUTPUT:  STARTPP = 1st pay period in range.  0 on abnormal exit. | 
|---|
| 151 | ;           ENDPP   = 2ND pay period in range.  0 on abnormal exit. | 
|---|
| 152 | ; | 
|---|
| 153 | ; -Ask user to select beginning and ending pay periods from the | 
|---|
| 154 | ;  pay periods that are on file. | 
|---|
| 155 | ; -Compare dates of 1st day of each of the input pay periods | 
|---|
| 156 | ;  to ensure that the beginning pay period input is LESS THAN OR = TO | 
|---|
| 157 | ;  the ending pay period input. | 
|---|
| 158 | ; | 
|---|
| 159 | N OUT,OK | 
|---|
| 160 | S (OUT,OK)=0 | 
|---|
| 161 | ; | 
|---|
| 162 | F I=0:0 Q:(OK!OUT)  D | 
|---|
| 163 | .N DIC,FR,X,Y,TO,DAY,PPE,PPI,PP4Y,D1,STRTDAY1,ENDDAY1 | 
|---|
| 164 | .S (STARTPP,ENDPP)=0 | 
|---|
| 165 | .; | 
|---|
| 166 | .S D1=DT D PP S DIC("B")=$E($$PREP(PPE),3,7) | 
|---|
| 167 | .S DIC="^PRST(458," | 
|---|
| 168 | .S DIC(0)="AEQZ",DIC("A")="Enter Beginning Pay Period: " | 
|---|
| 169 | .D ^DIC I $D(DTOUT)!$D(DUOUT)!(Y<0) S OUT=1 | 
|---|
| 170 | .Q:OUT | 
|---|
| 171 | .S STARTPP=Y(0,0) | 
|---|
| 172 | .; | 
|---|
| 173 | .; ask user for 2nd pay period in range. Use default of | 
|---|
| 174 | .; the pay period they selected for the 1st pp. | 
|---|
| 175 | .; | 
|---|
| 176 | .S DIC("B")=STARTPP,DIC("A")="Enter Ending Pay Period: " | 
|---|
| 177 | .D ^DIC I $D(DTOUT)!$D(DUOUT) S OUT=1 | 
|---|
| 178 | .Q:OUT | 
|---|
| 179 | .S ENDPP=Y(0,0) | 
|---|
| 180 | .; | 
|---|
| 181 | .;Get 1st day of selected pay periods. Compare the dates to ensure | 
|---|
| 182 | .;that a valid range has been entered. | 
|---|
| 183 | .; | 
|---|
| 184 | .S PPE=STARTPP D NX S STRTDAY1=D1 | 
|---|
| 185 | .S PPE=ENDPP D NX S ENDDAY1=D1 | 
|---|
| 186 | .I ENDDAY1-STRTDAY1<0 D | 
|---|
| 187 | .. W !,"Invalid pay period range." | 
|---|
| 188 | .. W !,"Ending pay period should be later than or equal to beginning pay period." | 
|---|
| 189 | .E  D | 
|---|
| 190 | ..  S D1=STRTDAY1 D PP^PRSAPPU S STPP4Y=PP4Y | 
|---|
| 191 | ..  S D1=ENDDAY1 D PP S ENDPP4Y=PP4Y | 
|---|
| 192 | ..  S OK=1 | 
|---|
| 193 | I OUT S (STARTPP,ENDPP,ENDPP4Y,STPP4Y)=0 | 
|---|
| 194 | ; | 
|---|
| 195 | Q | 
|---|
| 196 | ;============================================================== | 
|---|
| 197 | IC(YY,FMT,FW,BDT) ;Infer Century from 2-digit year | 
|---|
| 198 | ; YY  - 2 digit year | 
|---|
| 199 | ; FMT - (optional) format of returned value (DEFAULT 3) | 
|---|
| 200 | ;       3 for YYY (fileman year .i.e. first numbers of fileman date) | 
|---|
| 201 | ;       4 for YYYY (standard year) | 
|---|
| 202 | ; FW  - (optional) # of future years from base in window (DEFAULT 20) | 
|---|
| 203 | ; BDT - (optional) base date (fileman) for sliding window (DEFAULT DT) | 
|---|
| 204 | ; | 
|---|
| 205 | N FMY | 
|---|
| 206 | I YY'?2N Q "" ; invalid 2-digit year - return null value | 
|---|
| 207 | I $G(FMT)'=3&($G(FMT)'=4) S FMT=3 | 
|---|
| 208 | I $G(FW)'?1.2N S FW=20 | 
|---|
| 209 | I $G(BDT)'?7N S BDT=DT | 
|---|
| 210 | I BDT'>1000000 Q "" ; invalid base date | 
|---|
| 211 | ; start with century of base date and adjust if necessary | 
|---|
| 212 | S FMY=$E(BDT)+$S($E(BDT,2,3)-YY>(99-FW):1,$E(BDT,2,3)-YY<-FW:-1,1:0)_YY | 
|---|
| 213 | Q $S(FMT=4:FMY+1700,1:FMY) | 
|---|
| 214 | ; | 
|---|
| 215 | ;PRSZ | 
|---|
| 216 | ;============================================================== | 
|---|
| 217 | P35POST ;PRS*4.0*35 post install - execute set logic on new AB x-ref. | 
|---|
| 218 | ; | 
|---|
| 219 | I $$PATCH^XPDUTL("PRS*4.0*35") D MSSG(0) Q | 
|---|
| 220 | N FILE D MSSG(1) F FILE=458,459 D XREF4YR(FILE) | 
|---|
| 221 | Q | 
|---|
| 222 | ;============================================================== | 
|---|
| 223 | MSSG(FLAG) ;PRS*4.0*35 - OUTPUT POST INSTALLATION MESSAGE. | 
|---|
| 224 | N MSSG | 
|---|
| 225 | I FLAG S MSSG="Updating AB cross reference in Files 458 and 459." | 
|---|
| 226 | E  S MSSG="AB X-ref NOT built. Built during earlier PRS*4.0*35 install." | 
|---|
| 227 | D MES^XPDUTL("      "_MSSG) | 
|---|
| 228 | Q | 
|---|
| 229 | ;============================================================== | 
|---|
| 230 | XREF4YR(F) ;SET AB 4DIGIT YEAR XREF OF FILE 458 OR 459. | 
|---|
| 231 | ; | 
|---|
| 232 | Q:'((F=458)!(F=459)) | 
|---|
| 233 | N DIK S DIK="^PRST("_F_",",DIK(1)=".01^AB" D ENALL^DIK | 
|---|
| 234 | Q | 
|---|