1 | PRSPESR2 ;WOIFO/JAH - PTP ESR Edit-Calls from ScreenMan Form ;07/28/05
|
---|
2 | ;;4.0;PAID;**93**;Sep 21, 1995;Build 7
|
---|
3 | ;;Per VHA Directive 2004-038, this routine should not be modified.
|
---|
4 | Q
|
---|
5 | ELAPSE(MEAL,START,STOP) ; CALCULATE THE HOURS BETWEEN 2 TIMES
|
---|
6 | ;this function is called from ScreenMan Form Computed fields
|
---|
7 | ; file 458 PRSA ESR EDIT form.
|
---|
8 | N ELAPSE
|
---|
9 | S ELAPSE=0
|
---|
10 | Q:($G(START)="")!($G(STOP)="") ELAPSE
|
---|
11 | S START=$$TWENTY4(START)
|
---|
12 | ;
|
---|
13 | S STOP=$$TWENTY4(STOP)
|
---|
14 | ; if stop time is next day add a day
|
---|
15 | I STOP<START!(STOP=START) D
|
---|
16 | . S STOP=$$FMADD^XLFDT(DT,1,0,0,0)_"."_STOP
|
---|
17 | E D
|
---|
18 | . S STOP=DT_"."_STOP
|
---|
19 | S START=DT_"."_START
|
---|
20 | S ELAPSE=$$FMDIFF^XLFDT(STOP,START,3)
|
---|
21 | ;for special case of a 24 hour segment
|
---|
22 | I ELAPSE="1" S ELAPSE="24:00"
|
---|
23 | ;
|
---|
24 | ;Remove any blanks
|
---|
25 | S ELAPSE=$TR(ELAPSE," ","")
|
---|
26 | I $G(MEAL)>0 S ELAPSE=$$MEALESS(ELAPSE,MEAL)
|
---|
27 | S ELAPSE=$$FIVE(ELAPSE)
|
---|
28 | Q ELAPSE
|
---|
29 | FIVE(TIME) ;ENSURE ELAPSE IS A FIVE CHAR STRING--04:15 OR 02:00
|
---|
30 | N FIVE,HH,MM
|
---|
31 | I $E(TIME,1,1)="-" Q "-00:00"
|
---|
32 | S HH="00"_$P(TIME,":"),MM="00"_$P(TIME,":",2)
|
---|
33 | S HH=$E(HH,$L(HH)-1,$L(HH))
|
---|
34 | S MM=$E(MM,$L(MM)-1,$L(MM))
|
---|
35 | S MM=$P(TIME,":",2)_"0"
|
---|
36 | S MM=$E(MM,1,2)
|
---|
37 | S FIVE=HH_":"_MM
|
---|
38 | Q FIVE
|
---|
39 | TWENTY4(TIME) ;CONVERT TIME TO TWENTY FOUR HOUR TIME
|
---|
40 | ;
|
---|
41 | ; TIME Y: 0=Mid=0,1=Mid=2400 Output: Y=time in 2400
|
---|
42 | S Y=0
|
---|
43 | I TIME="MID"!(TIME="NOON") D
|
---|
44 | . S Y=$S(TIME="NOON":1200,TIME="MID":2400,1:0)
|
---|
45 | E D
|
---|
46 | . S Y=$P(TIME,":",1)_$P(TIME,":",2),Y=+Y
|
---|
47 | I TIME["P" D
|
---|
48 | . S:Y<1200 Y=Y+1200
|
---|
49 | ;
|
---|
50 | ; pad time with leading zeros so we always have 4 digits
|
---|
51 | ; for cases like start times of 15 past midnight 0015
|
---|
52 | ;
|
---|
53 | S Y="000"_Y
|
---|
54 | S Y=$E(Y,$L(Y)-3,$L(Y))
|
---|
55 | Q Y
|
---|
56 | MEALESS(HHMM,MEAL) ;Remove meal time from hours total
|
---|
57 | ; (subtract a 15 minute increment from length of time
|
---|
58 | ; in hh:mm format, i.e. hh:mm - mm
|
---|
59 | ;
|
---|
60 | N X,Y,DECR,OBJ,I
|
---|
61 | S MM=$P(HHMM,":",2) ; get minutes
|
---|
62 | ; quit minutes or meal not quarter hours
|
---|
63 | Q:(MM#15'=0&(+MM)!((MEAL#15)'=0&(+MEAL))) HHMM
|
---|
64 | ; get hours
|
---|
65 | S HH=$P(HHMM,":")
|
---|
66 | ;
|
---|
67 | ; convert segment minutes and meal to a digit.
|
---|
68 | ;
|
---|
69 | S X=MM D MEALIN S OBJ=X
|
---|
70 | S X=$G(MEAL) D MEALIN S DECR=X
|
---|
71 | I OBJ=0 S OBJ=4
|
---|
72 | F I=1:1:DECR D
|
---|
73 | . I OBJ=4 S HH="0"_(+HH-1) S HH=$E(HH,$L(HH)-1,$L(HH))
|
---|
74 | . S OBJ=$S(OBJ=4:3,OBJ=3:2,OBJ=2:1,OBJ=1:4)
|
---|
75 | S MM=$S(OBJ=1:15,OBJ=2:30,OBJ=3:45,1:"00")
|
---|
76 | Q $$FIVE(HH_":"_MM)
|
---|
77 | ;
|
---|
78 | MEALIN ;convert 15 minute meal to a digit
|
---|
79 | I +X#15=0 S X=X\15 Q
|
---|
80 | I "^0^00^15^30^45^60^75^90^105^120^"[("^"_$G(X)_"^") D
|
---|
81 | . S X=$S(+X=0:0,X=60:4,X=30:2,X=15:1,X=45:3,1:0)
|
---|
82 | E D
|
---|
83 | . K X
|
---|
84 | Q
|
---|
85 | MEALOUT ; convert meal digit to minutes
|
---|
86 | S Y=$S(Y=1:15,Y=2:30,Y=3:45,Y=4:60,1:"00")
|
---|
87 | Q
|
---|
88 | ;
|
---|
89 | VALIDTT ; Set DDSERROR if not a valid type of time.
|
---|
90 | ;This procedure is called from ScreenMan form PRSA ESR EDIT (file 458)
|
---|
91 | ;with the validate field of the Type Of Time.
|
---|
92 | ; set DDSERROR to reject user input, then ring bell and
|
---|
93 | ; display a message reject explanation
|
---|
94 | Q:X=""!($G(PPI)'>0)!($G(PRSIEN)'>0)!($G(PRSD)'>0)
|
---|
95 | I "^RG^AL^AA^DL^ML^RL^CP^SL^HX^CB^AD^WP^TR^TV^"'[(U_X_U) D
|
---|
96 | . S DDSERROR=1
|
---|
97 | . D HLP^DDSUTL("Invalid type of time.")
|
---|
98 | I "^HX^"[(U_X_U) D
|
---|
99 | . I $P($G(^PRST(458,PPI,"E",PRSIEN,"D",PRSD,0)),"^",12)'>0 S DDSERROR=1 D HLP^DDSUTL("Holiday Excused is only allowed on a Holiday Benefit Day. See Payroll to set this day as a holiday.")
|
---|
100 | I $G(PPI),$G(PRSD),$P(^PRST(458,PPI,1),U,PRSD)>$G(DT) D
|
---|
101 | . I "^AL^AA^DL^ML^RL^CP^SL^HX^CB^AD^WP^TR^TV^"'[(U_X_U) D
|
---|
102 | .. S DDSERROR=1
|
---|
103 | .. D HLP^DDSUTL("Invalid type of time. Only leave may be entered on future days")
|
---|
104 | Q
|
---|
105 | VALIDLV(SSCH,SPST) ; Set DDSERROR if any posting is outside the
|
---|
106 | ; tour time segements inappropriately
|
---|
107 | ;
|
---|
108 | ;INPUT:
|
---|
109 | ; SSCH : tour segments as scheduled from node 1 of the day multiple
|
---|
110 | ; SPST : tour segments as posted by ptp in T array format
|
---|
111 | N OK,P1,P2,S1,S2,LV,I,I2,J,MSA,VALIDLV
|
---|
112 | S (LV,OK,I)=0
|
---|
113 | S VALIDLV=""
|
---|
114 | ; put tour in similar format as posting
|
---|
115 | D MARRAY(.MSA,SSCH)
|
---|
116 | F S I=$O(SPST(I)) Q:I'>0!(LV&'OK) D
|
---|
117 | . S P1=I,I2=$O(SPST(I,0)),P2=$P(SPST(I,I2),U)
|
---|
118 | . Q:"^AL^AA^DL^CU^ML^RL^HX^SL^CB^AD^WP^TV^TR^"'[$P(SPST(I,I2),U,4)
|
---|
119 | . S LV=1,OK=0
|
---|
120 | . S J=0
|
---|
121 | . F S J=$O(MSA(J)) Q:J'>0!OK D
|
---|
122 | .. S S1=J,S2=$O(MSA(J,0)),S2=$P(MSA(J,S2),U)
|
---|
123 | .. I P1=S1!(P1>S1)&((P2=S2)!(P2<S2)) S OK=1
|
---|
124 | ;
|
---|
125 | I LV,('OK) S VALIDLV=1
|
---|
126 | Q VALIDLV
|
---|
127 | ;
|
---|
128 | MARRAY(MARRAY,SEGS) ; BUILD MINUTE ARRAY
|
---|
129 | ; INPUT : SEGS--tour of duty segments in global format
|
---|
130 | ; OUTPUT: MARRAY--array by reference of tour segments in minutes
|
---|
131 | ; from midnight format
|
---|
132 | ; EXAMPLE:
|
---|
133 | ; 2 segment tour will look like the following:
|
---|
134 | ; MARRAY(945,1)=1140^03:45P^07:00P
|
---|
135 | ; MARRAY(1140,6)=1305^07:00P^09:45P
|
---|
136 | ; MARRAY(1320,11)=1380^10:00P^11:00P
|
---|
137 | ;loop thru the 5 columns of the 7 time segments on ESR
|
---|
138 | ; quit if we encounter an error
|
---|
139 | ;
|
---|
140 | N I,ANY,Z1,Z2,X,Y
|
---|
141 | S ANY=1
|
---|
142 | F I=1:3:21 Q:('ANY) D
|
---|
143 | . ;
|
---|
144 | . ;if absolutely nothing on the segment then we're done
|
---|
145 | . S ANY=$L($P(SEGS,U,I)_$P(SEGS,U,I+1)_$P(SEGS,U,I+2))
|
---|
146 | . Q:'ANY
|
---|
147 | . S X=$P(SEGS,U,I)_U_$P(SEGS,U,I+1)
|
---|
148 | . D CNV^PRSATIM S Z1=$P(Y,U,1),Z2=$P(Y,U,2)
|
---|
149 | . D V0^PRSATP1
|
---|
150 | . S MARRAY(Z1,I)=Z2_U_$P(SEGS,U,I,I+2)
|
---|
151 | Q
|
---|
152 | PSTML(ROW) ; AUTO POST MEAL TIME
|
---|
153 | ; if the time segment row that we are on in a form covers
|
---|
154 | ; the tour then post a meal.
|
---|
155 | ; ROW - is passed as the
|
---|
156 | ; Z is in the form of NODE 5 in the 458.02 day mult
|
---|
157 | ; it changes with edits on the form
|
---|
158 | ; like Z=09:00A^NOON^RG^^30^NOON^08:00P^RG^^^08:00P^MID^CU^15
|
---|
159 | ;
|
---|
160 | N RNG,ST2SP,FLDNUM,BASE
|
---|
161 | Q:$G(PRSML)=""!($G(PRSML)=0)
|
---|
162 | ;
|
---|
163 | S BASE=ROW-1*5
|
---|
164 | ; quit if something is already in mealtime on the form
|
---|
165 | Q:$P(Z,U,BASE+5)'=""
|
---|
166 | ; compute the field number of the meal time for this row
|
---|
167 | S FLDNUM=BASE+114
|
---|
168 | ; get the start TO stop segments for this row of the form
|
---|
169 | ; if it's an exact match then auto post the meal
|
---|
170 | S ST2SP=$P(Z,U,BASE+1,BASE+2)
|
---|
171 | I ST2SP=$P($G(PRSN1),U,1,2) D Q
|
---|
172 | . D PUT^DDSVAL(DIE,.DA,FLDNUM,PRSML)
|
---|
173 | . D REFRESH^DDSUTL
|
---|
174 | ; get the start TO stop segments for this row of the form
|
---|
175 | ; if it covers the meal and then some autopost the meal
|
---|
176 | N DY2,TWO,SCHED,POST,SCH,P1,P2,S1,S2
|
---|
177 | ; TOD is a global set up in form start up in ESRFRM^PRSPESR1
|
---|
178 | S ST2SP=$P(Z,U,BASE+1,BASE+3)
|
---|
179 | S SCHED=$P($G(PRSN1),U,1,3)
|
---|
180 | ; is this a two day tour? need to check before calling the
|
---|
181 | ; code to set up the minutes array in MARRAY
|
---|
182 | S TWO=$P($G(^PRST(457.1,+TOD,0)),U,5)
|
---|
183 | S DY2=TWO="Y"
|
---|
184 | D MARRAY(.POST,ST2SP)
|
---|
185 | D MARRAY(.SCH,$P($G(PRSN1),U,1,3))
|
---|
186 | ;get start and stop time minutes form midnight for both
|
---|
187 | ; schedule and posting to determine if meal should be autoposted
|
---|
188 | S P1=$O(POST(0))
|
---|
189 | Q:P1'>0
|
---|
190 | S P2=$P(POST(P1,1),U)
|
---|
191 | Q:P2'>0
|
---|
192 | S S1=$O(SCH(0))
|
---|
193 | Q:S1'>0
|
---|
194 | S S2=$P(SCH(S1,1),U)
|
---|
195 | Q:22'>0
|
---|
196 | I P1'>S1&(P2'<S2) D
|
---|
197 | . D PUT^DDSVAL(DIE,.DA,FLDNUM,PRSML)
|
---|
198 | . D REFRESH^DDSUTL
|
---|
199 | . S $P(Z,U,BASE+5)=PRSML
|
---|
200 | Q
|
---|
201 | ;
|
---|
202 | OVEREAT(ROW) ; Display warning on POST ACTION ON CHANGE for the
|
---|
203 | ; meal field on the form if lunch more than allotted for tour
|
---|
204 | N MTOT,K,BASE,WORK,STR,PRSZ
|
---|
205 | ; When X is null they are trying to delete and that's always ok
|
---|
206 | Q:$G(Z)=""!($G(ROW)'>0)!($G(X)="")
|
---|
207 | S BASE=ROW-1*5
|
---|
208 | ;
|
---|
209 | S WORK=$$ELAPSE^PRSPESR2(X,$P(Z,U,BASE+1),$P(Z,U,BASE+2))
|
---|
210 | I $E(WORK,1,1)="-"!(WORK="00:00")!(WORK=0) D Q
|
---|
211 | . S DDSERROR=1
|
---|
212 | . S STR="Meal time greater than or equal to time segment."
|
---|
213 | . I X=0 S STR=STR_" Type @ to remove meal time."
|
---|
214 | . D HLP^DDSUTL(STR)
|
---|
215 | S MTOT=0
|
---|
216 | S PRSZ=Z S $P(PRSZ,U,BASE+5)=X
|
---|
217 | F K=1:5:31 S MTOT=MTOT+$P(PRSZ,U,K+4)
|
---|
218 | I MTOT>($G(PRSML)+$G(PRSML2)) D
|
---|
219 | . S STR="Warning: More meal time than allotted with tour."
|
---|
220 | . D HLP^DDSUTL(.STR)
|
---|
221 | Q
|
---|
222 | BURP(PRSN5) ; return ESR WORK NODE with no blank pieces
|
---|
223 | ; PRSN5--esr work node $G(^PRST(458,PPI,"E",PRSIEN,"D",PRSD,5)
|
---|
224 | ; if there's only a meal with a zero then skip that too.
|
---|
225 | ;^^^^^NOON^08:00P^RG^^^08:00P^MID^CU^15
|
---|
226 | ;
|
---|
227 | N SN,I,TSEG
|
---|
228 | S SN=""
|
---|
229 | F I=1:5:31 D
|
---|
230 | . S TSEG=$P(PRSN5,U,I,I+4)
|
---|
231 | .; W !,I,": ",TSEG
|
---|
232 | . Q:TSEG="^^^^"!(TSEG="")!(TSEG="^^^^0")
|
---|
233 | . S SN=SN_TSEG_"^"
|
---|
234 | Q SN
|
---|