| 1 | PRS8ST ;HISC/MGD-DECOMPOSITION, START-UP ;12/12/05 | 
|---|
| 2 | ;;4.0;PAID;**45,92,102**;Sep 21, 1995 | 
|---|
| 3 | ; | 
|---|
| 4 | ;This routine is the one which actually gets everything moving. | 
|---|
| 5 | ;It moves the information from the ^TMP global into a local array | 
|---|
| 6 | ;[DAY(DAY)] for the three day period it's working with.  It then | 
|---|
| 7 | ;processes that information internally and, where necessary, by | 
|---|
| 8 | ;calling certain external processes. | 
|---|
| 9 | ; | 
|---|
| 10 | ;Called by Routines:  PRS8SU | 
|---|
| 11 | ; | 
|---|
| 12 | K SBY F DAY=1:1:14 D | 
|---|
| 13 | .K DAY(DAY-2) | 
|---|
| 14 | .S LP=$S(DAY=1:"0,1,2",1:(DAY+1)),JURY=0 | 
|---|
| 15 | .F II=1:1 S DY=$P(LP,",",II) Q:DY=""  D | 
|---|
| 16 | ..F J=0,1,2,4,10,"CP","DH1","DH2","HOL","ML","MT1","MT2","OFF","P","TOUR","TWO","W" D | 
|---|
| 17 | ...S DAY(DY,J)=$G(^TMP($J,"PRS8",DY,J)) | 
|---|
| 18 | ...; | 
|---|
| 19 | ...;P 45 INITIALIZE THE "F" NODE HERE BY SIMPLY COPYING THE | 
|---|
| 20 | ...;THE "W" NODE FROM TEMP--FOR TESTING PURPOSES. | 
|---|
| 21 | ...;THE NODE SHOULD BE INITIALIZED BY COPYING THE "F" NODE | 
|---|
| 22 | ...;FROM THE TEMP GLOBAL. | 
|---|
| 23 | ...S DAY(DY,"F")=$G(^TMP($J,"PRS8",DY,"W")) | 
|---|
| 24 | .F II=1:1 S DY=$P(LP,",",II) Q:DY=""  D | 
|---|
| 25 | ..S WK=$S(DY<8:1,1:2) | 
|---|
| 26 | ..S TOUR=$S(TYP'["W":1,+DAY(DY,"TOUR"):+DAY(DY,"TOUR"),1:+TOUR(WK)) | 
|---|
| 27 | ..D MOVE^PRS8AC S N=DAY(DY,2),WK=$S(DY<8:1,1:2) ;exception node/week | 
|---|
| 28 | ..I N["UN" S X1="UN" D 2 ;unavailable | 
|---|
| 29 | ..I N["HX" S X1="HX" D 2 ;holiday excused | 
|---|
| 30 | ..I N["ON" S X1="ON" D 2 ;on-call | 
|---|
| 31 | ..I N["SB" S X1="SB" D 2 ;standby | 
|---|
| 32 | ..S N=DAY(DY,1),DH=DAY(DY,"DH1"),NN=1 D  I DAY(DY,"TWO") S N=DAY(DY,4),DH=DAY(DY,"DH2"),NN=4 D | 
|---|
| 33 | ...S QT=0 F PRS8=1:3 S V=$P(N,"^",PRS8,PRS8+2) Q:QT  D | 
|---|
| 34 | ....N PRS8AFFH S PRS8AFFH=0 ;fire fighter additional hours flag | 
|---|
| 35 | ....S X=$P(DAY(DY,NN),"^",PRS8,999) | 
|---|
| 36 | ....I X="" S QT=1 Q  ;nothing left to check | 
|---|
| 37 | ....I X?1"^"."^" S QT=1 Q  ;only ^ left | 
|---|
| 38 | ....; | 
|---|
| 39 | ....; X = 9 is special tour CODE FOR FF ADDTL HRS. | 
|---|
| 40 | ....; It gets converted to 'f' | 
|---|
| 41 | ....S X=$P(V,"^",3),VAR=1 I X S VAR=$E("se1BC235f",+X) I '+VAR D ENT Q:Q | 
|---|
| 42 | ....;if this segment is addt ff hrs then save a variable to signify | 
|---|
| 43 | ....;that, but convert the time back to a 1 to use in the W node. | 
|---|
| 44 | ....I "Ff"[TYP,VAR="f" S (PRS8AFFH,VAR)=1 | 
|---|
| 45 | ....; | 
|---|
| 46 | ....I VAR,TYP'["W" S VAR=$S(VAR=5:5,1:1) ;only wg need shifts | 
|---|
| 47 | ....S JURY=$G(^TMP($J,"PRS8",DY,2)) I JURY'="" D | 
|---|
| 48 | .....F J=4,8,12,16,20,24,28 S:$P(JURY,"^",J)=6 JURY=1 Q | 
|---|
| 49 | ....D ^PRS8AC ;build "W" node | 
|---|
| 50 | ..S N=DAY(DY,2),WK=$S(DY<8:1,1:2) ;exception node/week | 
|---|
| 51 | ..S QT=0 F PRS8=1:4:25 S V=$P(N,"^",PRS8,PRS8+3) Q:QT  D | 
|---|
| 52 | ...I TYP["D",$P(V,"^",3)="" S QT=1 Q  ;doctor | 
|---|
| 53 | ...I TYP'["D",'+V,$P(V,"^",3)="" S QT=1 Q  ;all others | 
|---|
| 54 | ...S X=$P(V,"^",3) I "^UN^ON^SB^HX^"'[("^"_X_"^") D ^PRS8EX | 
|---|
| 55 | ..S ^TMP($J,"PRS8",DY,"W")=DAY(DY,"W") ;save in ^TMP | 
|---|
| 56 | ..S ^TMP($J,"PRS8",DY,"P")=DAY(DY,"P") ;save non-prem ot in ^TMP | 
|---|
| 57 | ..S ^TMP($J,"PRS8",DY,"HOL")=DAY(DY,"HOL") ;holiday | 
|---|
| 58 | .S WK=$S(DAY<8:1,1:2),OFF=+DAY(DAY,"OFF") ;week/day off | 
|---|
| 59 | .S TOUR=$S(TYP'["W":1,+DAY(DAY,"TOUR"):+DAY(DAY,"TOUR"),1:+TOUR(WK)) | 
|---|
| 60 | .I TYP["I",DAY>0,DAY<15,$G(DAY(DAY,"DWK")) D  ;days worked | 
|---|
| 61 | ..S DWK=DWK+1 ;count days worked | 
|---|
| 62 | ..I CYA,DAY'<CYA S CAMISC=CAMISC+1 ;calendar year adjustment (CA) | 
|---|
| 63 | .S MDY=+DAY D ^PRS8MT I +DAY=1 S MDY=0 D ^PRS8MT | 
|---|
| 64 | .Q | 
|---|
| 65 | ; | 
|---|
| 66 | F DAY=1:1:14 D | 
|---|
| 67 | .;make DAY array available for prior, current, and next day | 
|---|
| 68 | .K DAY(DAY-2) | 
|---|
| 69 | .S LP=$S(DAY=1:"0,1,2",1:(DAY+1)) | 
|---|
| 70 | .F II=1:1 S DY=$P(LP,",",II) Q:DY=""  D | 
|---|
| 71 | ..F J=0,1,2,4,10,"CP","DH1","DH2","HOL","ML","MT1","MT2","OFF","P","TOUR","TWO","W","F" S DAY(DY,J)=$G(^TMP($J,"PRS8",DY,J)) | 
|---|
| 72 | .; | 
|---|
| 73 | .S WK=$S(DAY<8:1,1:2),OFF=+DAY(DAY,"OFF") ;week/day off | 
|---|
| 74 | .S TOUR=$S(TYP'["W":1,+DAY(DAY,"TOUR"):+DAY(DAY,"TOUR"),1:+TOUR(WK)) | 
|---|
| 75 | .; | 
|---|
| 76 | .I ((TYP["I")!(TYP["P")),DAY>0,DAY<15 D  ;FOR CY | 
|---|
| 77 | ..I $S('CYA:1,DAY<CYA:1,1:0) Q  ;quit if no calander year adjustment | 
|---|
| 78 | ..S IIX=0 I $E(ENT,2)'="D" F II=1:1:$L(DAY(DAY,"W")) D | 
|---|
| 79 | ...I "4E"[$E(DAY(DAY,"W"),II) S IIX=IIX+1 | 
|---|
| 80 | ...S CYA2806=CYA2806+("ALSUMRVW1235OscXYFGD"[$E(DAY(DAY,"W"),II)) S:(IIX<33)&(FLX'="C"&(TH(WK)+IIX<163))!(FLX="C"&(TH+IIX<323)) CYA2806=CYA2806+("4E"[$E(DAY(DAY,"W"),II)) | 
|---|
| 81 | ...;SF2806 adjustment (CY) (163 & 323 because mt subtracted) | 
|---|
| 82 | .; | 
|---|
| 83 | .I CYA,DAY'<CYA,DAY(DAY,"W")["W" D  ;count wop in hours for CA | 
|---|
| 84 | ..F II=1:1:$L(DAY(DAY,"W")) S WPCYA=WPCYA+("W"=$E(DAY(DAY,"W"),II)) | 
|---|
| 85 | .; | 
|---|
| 86 | .I TYP'["D",DAY(DAY,"W")'?1"0"."0" D ^PRS8PP ;nightdiff/shift premiums | 
|---|
| 87 | .; | 
|---|
| 88 | .F T=1:1:96 S VAR1=$E(DAY(DAY,"W"),T) S OK=0 D | 
|---|
| 89 | ..I "BbCct"[VAR1 D  ; process on-call/standby | 
|---|
| 90 | ...I T=96!("BbCct"'[$E(DAY(DAY,"W"),T+1)) S OK=T | 
|---|
| 91 | ...I DOUB D ^PRS8OC,^PRS8SB Q  ;Prem. Pay of "W" or "V" | 
|---|
| 92 | ...I VAR1'=""&("Cct"[VAR1) D ^PRS8OC Q  ;compte on-call/2hr minimum | 
|---|
| 93 | ...I "Bb"[VAR1 D ^PRS8SB ;standby | 
|---|
| 94 | .I $G(SBY) D UP^PRS8SB | 
|---|
| 95 | .; | 
|---|
| 96 | .Q | 
|---|
| 97 | ; | 
|---|
| 98 | ;P 45 CODE O firefighters use PRS8MISC to calculated overtime | 
|---|
| 99 | ;but code R and C firefighters use routine PRS8OTFF. | 
|---|
| 100 | ; | 
|---|
| 101 | I "Ff"[TYP&("RC"[PMP) D | 
|---|
| 102 | .  D ^PRS8OTFF | 
|---|
| 103 | E  D | 
|---|
| 104 | .  D ^PRS8MISC | 
|---|
| 105 | K DH,DY,I,J,JURY,K,K1,LP,N,NN,OFF,PRS8L,TOUR,V,VAR,WG,X,Y,Y1 | 
|---|
| 106 | D ^PRS8WE ;Weekend premiums | 
|---|
| 107 | D ^PRS8UP ;finish up Misc and non-time related activities | 
|---|
| 108 | Q | 
|---|
| 109 | ; | 
|---|
| 110 | ENT ; --- check entitlement to activity for 1 node non-norm hrs | 
|---|
| 111 | S Q=0 | 
|---|
| 112 | I '$E(ENT,$P("12^28^^29^26^^^29","^",+X)) S Q=1 ;entitlement string | 
|---|
| 113 | ;PATCH 45: ADD CHECK FOR FIRE FIGHTER ADDITIONAL HOURS | 
|---|
| 114 | ;SINCE THIS TYPE OF TIME IS NOT IN THE ENTITLMENT TABLE | 
|---|
| 115 | ;IT IS SET UP WITH TOUR IND. WITH CODE 9 | 
|---|
| 116 | I "Ff"[TYP,X=9 S Q=0 | 
|---|
| 117 | Q:X'=12  I TYP["W",TOUR>1,$E(ENT,11+TOUR) S Q=0 | 
|---|
| 118 | Q | 
|---|
| 119 | ; | 
|---|
| 120 | 2 ; --- get 2 node unavailable/oncall and standby | 
|---|
| 121 | F PRS8=1:4:25 S V=$P(N,"^",PRS8,PRS8+2) Q:$P(V,"^",1)=""  D | 
|---|
| 122 | .S X=$P(V,"^",3) I X=X1 D ^PRS8EX | 
|---|
| 123 | K PRS8,X,V Q | 
|---|