PluginProbe
ShiftController Employee Shift Scheduling / 3.2.4
ShiftController Employee Shift Scheduling v3.2.4
4.9.97 4.9.96 4.9.95 4.9.74 4.9.75 4.9.76 4.9.77 4.9.78 4.9.84 4.9.85 4.9.87 4.9.91 4.9.92 trunk 2.1.0 2.1.1 2.1.2 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 3.2.4 All 38 releases
shiftcontroller / application / presenters / shift.php

shift.php in ShiftController Employee Shift Scheduling 3.2.4, at application/presenters/shift.php

675 lines 17.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 class Shift_HC_Presenter extends HC_Presenter
3 {
4 function label( $model, $vlevel = HC_PRESENTER::VIEW_HTML )
5 {
6 $return = '';
7 switch( $model->type ){
8 case SHIFT_HC_MODEL::TYPE_SHIFT:
9 switch( $vlevel ){
10 case HC_PRESENTER::VIEW_HTML:
11 case HC_PRESENTER::VIEW_HTML_ICON:
12 $return = HC_Html::icon(HC_App::icon_for('shift'));
13 break;
14 case HC_PRESENTER::VIEW_TEXT:
15 $return = HCM::__('Shift');
16 break;
17 }
18 break;
19
20 case SHIFT_HC_MODEL::TYPE_TIMEOFF:
21 switch( $vlevel ){
22 case HC_PRESENTER::VIEW_HTML:
23 case HC_PRESENTER::VIEW_HTML_ICON:
24 $return = HC_Html::icon(HC_App::icon_for('timeoff'));
25 break;
26 case HC_PRESENTER::VIEW_TEXT:
27 $return = HCM::__('Timeoff');
28 break;
29 }
30 break;
31 }
32 return $return;
33 }
34
35 public function property_name( $model, $pname, $vlevel = HC_PRESENTER::VIEW_HTML )
36 {
37 $return = parent::property_name( $model, $pname, $vlevel );
38
39 switch( $pname ){
40 case 'user':
41 $return = $model->user->present_label($vlevel);
42 break;
43 case 'location':
44 // $return = $model->location->present_label($vlevel);
45 $return = HCM::__('Location');
46 break;
47 case 'start':
48 $return = HCM::__('Start Time');
49 break;
50 case 'lunch_break':
51 $return = HCM::__('Break');
52 break;
53 case 'end':
54 $return = HCM::__('End Time');
55 break;
56 case 'release_request':
57 $return = HCM::__('Shift Release');
58 break;
59 }
60 return $return;
61 }
62
63 function id( $model, $vlevel = HC_PRESENTER::VIEW_HTML )
64 {
65 $return = array();
66 switch( $vlevel ){
67 case HC_PRESENTER::VIEW_HTML:
68 $return = 'id:' . $model->id;
69 $return = HC_Html_Factory::element('span')
70 ->add_style('mute')
71 ->add_style('nowrap')
72 ->add_style('font-size', -1)
73 ->add_child( $return )
74 ;
75 break;
76 case HC_PRESENTER::VIEW_TEXT:
77 $return = 'id:' . $model->id;
78 break;
79 case HC_PRESENTER::VIEW_RAW:
80 $return = $model->id;
81 break;
82 }
83
84 return $return;
85 }
86
87 function text( $model, $vlevel = HC_PRESENTER::VIEW_HTML, $with_change = FALSE )
88 {
89 $return = array();
90 $return['date'] = $model->present_date($vlevel, $with_change);
91 $return['time'] = $model->present_time($vlevel, $with_change);
92 if( $model->type == $model->_const('TYPE_SHIFT') ){
93 $return['location'] = $model->present_location($vlevel, $with_change);
94 }
95 $return['user'] = $model->present_user($vlevel, $with_change);
96 return $return;
97 }
98
99 function status_class( $model )
100 {
101 $return = array();
102 list( $label_text, $label_class ) = $this->_status_details($model);
103 if( ! is_array($label_class) )
104 $label_class = array( $label_class );
105 $return = array_merge( $return, $label_class );
106 return $return;
107 }
108
109 function type( $model, $vlevel = HC_PRESENTER::VIEW_HTML )
110 {
111 switch( $model->type ){
112 case $model->_const('TYPE_TIMEOFF'):
113 $type_text = HCM::__('Timeoff');
114 $type_icon = 'timeoff';
115 break;
116 default:
117 $type_text = HCM::__('Shift');
118 $type_icon = 'shift';
119 break;
120 }
121
122 switch( $vlevel ){
123 case HC_PRESENTER::VIEW_HTML:
124 $return = HC_Html_Factory::widget('titled', 'span')
125 ->add_style('badge')
126 ->add_child( HC_Html::icon(HC_App::icon_for($type_icon)) )
127 ->add_child( $type_text )
128 ;
129 break;
130 case HC_PRESENTER::VIEW_HTML_ICON:
131 $return = HC_Html::icon( HC_App::icon_for($type_icon) );
132
133 list( $label_text, $label_class ) = $this->_status_details($model);
134 $title = array();
135 $title[] = $model->present_type(HC_PRESENTER::VIEW_RAW);
136 $title[] = $label_text;
137 $title = join( ': ', $title );
138 $return->add_attr('title', $title);
139 break;
140 case HC_PRESENTER::VIEW_TEXT:
141 $return = HCM::_x('Type', 'noun') . ': ' . $type_text;
142 break;
143 case HC_PRESENTER::VIEW_RAW:
144 $return = $type_text;
145 break;
146 }
147
148 return $return;
149 }
150
151 function status( $model, $vlevel = HC_PRESENTER::VIEW_HTML )
152 {
153 list( $label_text, $label_class ) = $this->_status_details($model);
154 $label_class = $this->status_class($model, TRUE);
155 $type_text = $model->present_type( HC_PRESENTER::VIEW_RAW );
156
157 switch( $vlevel ){
158 case HC_PRESENTER::VIEW_HTML:
159 case HC_PRESENTER::VIEW_HTML_ICON:
160 $label_text_text = $model->present_status( HC_PRESENTER::VIEW_RAW );
161
162 $return = HC_Html_Factory::element('span')
163 ->add_attr('title', $label_text_text)
164 ->add_child( $label_text )
165 ->add_style('padding', 1)
166 ->add_style('rounded')
167 ;
168
169 $type = $model->type;
170 switch( $type ){
171 case $model->_const('TYPE_TIMEOFF'):
172 $color = '#ddd';
173 $color = '#eee';
174 break;
175 default:
176 $color = '#dff0d8';
177 // $color = Hc_lib::random_html_color( 2 );
178 break;
179 }
180
181 if( $model->status == $model->_const('STATUS_DRAFT') ){
182 $color1 = HC_Lib::adjust_color_brightness( $color, 0 );
183 $color2 = HC_Lib::adjust_color_brightness( $color, 20 );
184
185 $return->add_attr('style',
186 "background: repeating-linear-gradient(
187 -45deg,
188 $color1,
189 $color1 6px,
190 $color2 6px,
191 $color2 12px
192 );
193 "
194 );
195 }
196 else {
197 $return->add_attr('style', 'background-color: ' . $color . ';');
198 }
199
200 break;
201 case HC_PRESENTER::VIEW_TEXT:
202 $return = join(': ', array(HCM::__('Status'), $type_text, $label_text));
203 break;
204 case HC_PRESENTER::VIEW_RAW:
205 $type_label = $model->present_label( $vlevel );
206 $return = join(': ', array($type_text, $label_text));
207 break;
208 }
209
210 return $return;
211 }
212
213 private function _status_details( $model, $skip_type = TRUE )
214 {
215 $return = NULL;
216 $status = $model->status;
217 $type = $model->type;
218
219 switch( $type ){
220 case $model->_const('TYPE_TIMEOFF'):
221 $details = array(
222 SHIFT_HC_MODEL::STATUS_ACTIVE => array( HCM::__('Active'), 'warning' ),
223 SHIFT_HC_MODEL::STATUS_DRAFT => array( HCM::__('Pending'), array('warning-o', 'border-dotted') ),
224 );
225 break;
226 default:
227 $details = array(
228 SHIFT_HC_MODEL::STATUS_ACTIVE => array( HCM::__('Active'), 'success' ),
229 // SHIFT_HC_MODEL::STATUS_DRAFT => array( HCM::__('Draft'), array('success-o', 'border-dotted') ),
230 SHIFT_HC_MODEL::STATUS_DRAFT => array( HCM::__('Draft'), array('success-o') ),
231 );
232 break;
233 }
234
235 if( isset($details[$status]) ){
236 $return = $details[$status];
237 }
238
239 return $return;
240 }
241
242 public function conflict_class( $model )
243 {
244 if( $model->status == $model->_const('STATUS_ACTIVE') ){
245 $return = array('danger-o');
246 $return = array('danger-m');
247 // $return = array('danger', 'danger-o');
248 }
249 else {
250 // $return = array('danger-m');
251 $return = array();
252 $return = array('danger-m');
253 }
254 return $return;
255 }
256
257 function status_text( $model )
258 {
259 $return = '';
260 $details = $this->_status_details( $model );
261 if( $details ){
262 $return = $details[0];
263 }
264 return $return;
265 }
266
267 function title( $model, $vlevel = HC_PRESENTER::VIEW_HTML )
268 {
269 $return = array(
270 $model->present_date($vlevel),
271 $model->present_time($vlevel),
272 );
273 $return = join( ' ', $return );
274
275 return $return;
276 }
277
278 function title_misc( $model )
279 {
280 $title_misc = array();
281
282 switch( $model->type ){
283 case $model->_const('TYPE_SHIFT'):
284 $title_misc[] = $model->present_location();
285 break;
286 }
287
288 $title_misc[] = $model->present_user();
289
290 $out = HC_Html_Factory::widget('list')
291 ->add_style('inline')
292 ->add_style('margin', 'r1', 'b1')
293 ;
294 foreach( $title_misc as $tm ){
295 $out->add_child( $tm );
296 }
297 return $out;
298 }
299
300 function title_misc_misc( $model )
301 {
302 $title_misc = array();
303 $title_misc[] = 'id: ' . $model->id;
304
305 $out = HC_Html_Factory::widget('list')
306 ->add_children_style('inline')
307 ->add_children_style('margin', 'r1', 'b1')
308 ;
309 foreach( $title_misc as $tm ){
310 $out->add_child( $tm );
311 }
312 return $out;
313 }
314
315 function details( $model, $vlevel = HC_PRESENTER::VIEW_HTML )
316 {
317 switch( $vlevel ){
318 case HC_PRESENTER::VIEW_HTML:
319 $return = HC_Html_Factory::widget('shift_view');
320 $return->set_shift( $model );
321 break;
322 case HC_PRESENTER::VIEW_TEXT:
323 case HC_PRESENTER::VIEW_RAW:
324 $return = array();
325 $return[] = $model->present_title($vlevel);
326 $return[] = $model->present_title_misc($vlevel);
327 $return = join( ' ', $return );
328 break;
329 }
330 return $return;
331 }
332
333 function user( $model, $vlevel = HC_PRESENTER::VIEW_HTML, $with_change = FALSE )
334 {
335 if( ! isset($model->user) )
336 $model->user->get();
337
338 $return = array();
339 if( $model->user->id && $model->user->exists() ){
340 $return[] = $model->user->present_title($vlevel);
341 }
342 else {
343 switch( $vlevel ){
344 case HC_PRESENTER::VIEW_HTML:
345 $user_view = $model->user->present_label($vlevel) . '______';
346 $user_view = HC_Html_Factory::element('span')
347 ->add_attr('title', HCM::__('Open Shift'))
348 ->add_child( $user_view )
349 ->add_style('color', 'orange')
350 ;
351 break;
352 default:
353 $user_view = HCM::__('Open Shift');
354 break;
355 }
356 $return[] = $user_view;
357 }
358
359 if( $with_change ){
360 $changes = $model->get_changes();
361 if(
362 isset($changes['user_id'])
363 ){
364 $current_user_id = $model->user ? $model->user->id : 0;
365 if( $changes['user_id'] != $current_user_id ){
366 $old_obj = HC_App::model( $model->user->my_class() );
367 $old_obj->get_by_id( $changes['user_id'] );
368 $return[] = ' [' . HCM::__('Old Value') . ': ' . $old_obj->present_title(HC_PRESENTER::VIEW_RAW) . ']';
369 }
370 }
371 }
372 $return = join( '', $return );
373 return $return;
374 }
375
376 function location( $model, $vlevel = HC_PRESENTER::VIEW_HTML, $with_change = FALSE )
377 {
378 if( $model->type == $model->_const('TYPE_TIMEOFF') ){
379 $return = array();
380 $return[] = $model->location->set('name', HCM::__('Timeoff'))->present_title($vlevel);
381 }
382 else {
383 if( ! (isset($model->location) && $model->location->id) ){
384 $model->location->get();
385 }
386
387 $return = array();
388 $return[] = $model->location->present_title($vlevel);
389
390 if( $with_change ){
391 $changes = $model->get_changes();
392 if(
393 isset($changes['location_id'])
394 ){
395 $old_obj = HC_App::model( $model->location->my_class() );
396 $old_obj->get_by_id( $changes['location_id'] );
397 $return[] = ' [' . HCM::__('Old Value') . ': ' . $old_obj->present_title(HC_PRESENTER::VIEW_RAW) . ']';
398 }
399 }
400 }
401 $return = join( '', $return );
402 return $return;
403 }
404
405 function start( $model, $vlevel = HC_PRESENTER::VIEW_HTML )
406 {
407 return $this->_time( $model->start, $vlevel );
408 }
409
410 function end( $model, $vlevel = HC_PRESENTER::VIEW_HTML )
411 {
412 return $this->_time( $model->end, $vlevel );
413 }
414
415 function release_request( $model, $vlevel = HC_PRESENTER::VIEW_HTML )
416 {
417 $return = NULL;
418 if( $model->release_request ){
419 $return = HCM::__('Pending');
420 }
421 else {
422 $return = HCM::__('No Request');
423 }
424 return $return;
425 }
426
427 private function _time( $value, $vlevel = HC_PRESENTER::VIEW_HTML )
428 {
429 $return = array();
430 switch( $vlevel ){
431 case HC_PRESENTER::VIEW_HTML:
432 $return[] = HC_Html::icon(HC_App::icon_for('time'));
433 break;
434 case HC_PRESENTER::VIEW_TEXT:
435 $return[] = HCM::__('Time');
436 $return[] = ': ';
437 break;
438 }
439
440 $t = HC_Lib::time();
441 $t->setTimestamp( $value );
442 $return[] = $t->formatTime();
443
444 $return = join( '', $return );
445 return $return;
446 }
447
448 function lunch_break( $model, $vlevel = HC_PRESENTER::VIEW_HTML, $with_change = FALSE )
449 {
450 if( $model->type == $model->_const('TYPE_TIMEOFF') ){
451 return;
452 }
453
454 $break = $model->lunch_break;
455 if( ! $break ){
456 return;
457 }
458
459 $t = HC_Lib::time();
460 $return = array();
461
462 switch( $vlevel ){
463 case HC_PRESENTER::VIEW_HTML:
464 $return[] = HC_Html::icon(HC_App::icon_for('break'));
465 break;
466 default:
467 $return[] = HCM::__('Break');
468 $return[] = ': ';
469 break;
470 }
471
472 $break_view = $t->formatPeriodExtraShort( $break, 'min' );
473 $return[] = $break_view;
474
475 $return = join( '', $return );
476 return $return;
477 }
478
479 function time( $model, $vlevel = HC_PRESENTER::VIEW_HTML, $with_change = FALSE, $with_break = TRUE )
480 {
481 $t = HC_Lib::time();
482 $conf = HC_App::app_conf();
483 $show_end_time = $conf->get('show_end_time');
484
485 $return = array();
486 switch( $vlevel ){
487 case HC_PRESENTER::VIEW_HTML:
488 if( $model->type == $model->_const('TYPE_TIMEOFF') ){
489 $return[] = HC_Html::icon(HC_App::icon_for('timeoff'));
490 }
491 else {
492 // $return[] = HC_Html::icon(HC_App::icon_for('time'));
493 }
494 break;
495 case HC_PRESENTER::VIEW_TEXT:
496 $return[] = HCM::__('Time');
497 $return[] = ': ';
498 break;
499 }
500
501 switch( $model->type ){
502 case $model->_const('TYPE_TIMEOFF'):
503 $period_view = $t->formatPeriodOfDay($model->start, $model->end);
504 break;
505
506 default:
507 if( $show_end_time ){
508 $period_view = $t->formatPeriodOfDay($model->start, $model->end);
509 }
510 else {
511 $t->setStartDay();
512 $period_view = $t->modify('+' . $model->start . ' seconds')->formatTime();
513 }
514 break;
515 }
516
517 $period_view = str_replace(' ', '', $period_view);
518 $return[] = $period_view;
519
520 if( $with_break ){
521 $break_view = $model->present_lunch_break($vlevel);
522 if( strlen($break_view) ){
523 $return[] = ' ' . $break_view;
524 }
525 }
526
527 if( $with_change ){
528 $changes = $model->get_changes();
529 if(
530 isset($changes['start'])
531 OR
532 isset($changes['end'])
533 OR
534 isset($changes['lunch_break'])
535 ){
536 $old_start = isset($changes['start']) ? $changes['start'] : $model->start;
537 $old_end = isset($changes['end']) ? $changes['end'] : $model->end;
538 $old_lunch_break = isset($changes['lunch_break']) ? $changes['lunch_break'] : $model->lunch_break;
539
540 $old_model = clone $model;
541 $old_model->start = $old_start;
542 $old_model->end = $old_end;
543 $old_model->lunch_break = $old_lunch_break;
544
545 $return[] = ' [' . HCM::__('Old Value') . ': ' . $old_model->present_time($vlevel) . ']';
546 }
547 }
548
549 $return = join( '', $return );
550 return $return;
551 }
552
553 function date( $model, $vlevel = HC_PRESENTER::VIEW_HTML, $with_change = FALSE )
554 {
555 $t = HC_Lib::time();
556 $t->setDateDb( $model->date );
557
558 $return = array();
559 switch( $vlevel ){
560 case HC_PRESENTER::VIEW_HTML:
561 $return[] = HC_Html::icon(HC_App::icon_for('date'));
562 break;
563 case HC_PRESENTER::VIEW_TEXT:
564 $return[] = HCM::__('Date');
565 $return[] = ': ';
566 break;
567 }
568
569 $return[] = $t->formatDateFull();
570
571 if( $with_change ){
572 $changes = $model->get_changes();
573 if(
574 isset($changes['date'])
575 ){
576 $t->setDateDb( $changes['date'] );
577 $return[] = ' [' . HCM::__('Old Value') . ': ' . $t->formatDateFull() . ']';
578 }
579 }
580
581 $return = join( '', $return );
582 return $return;
583 }
584
585 function calendar_refresh( $model )
586 {
587 $refresh_keys = array();
588 $refresh_keys[] = 'dat-' . $model->date;
589 $refresh_keys[] = $model->location_id ? 'loc-' . $model->location_id : 'loc-0';
590 $refresh_keys[] = $model->user_id ? 'use-' . $model->user_id : 'use-0';
591
592 $parent_refresh = HC_Lib::get_combinations($refresh_keys);
593
594 if( $model->date_end != $model->date ){
595 $refresh_keys = array();
596 $refresh_keys[] = 'dat-' . $model->date_end;
597 $refresh_keys[] = $model->location_id ? 'loc-' . $model->location_id : 'loc-0';
598 $refresh_keys[] = $model->user_id ? 'use-' . $model->user_id : 'use-0';
599
600 $parent_refresh2 = HC_Lib::get_combinations($refresh_keys);
601 $parent_refresh = array_merge( $parent_refresh, $parent_refresh2 );
602 }
603
604 $refresh_keys2 = array();
605 $refresh_keys3 = array();
606 $changes = $model->get_changes();
607
608 if( ! array_key_exists('id', $changes) ){
609 if( array_intersect(array('date', 'user_id', 'location_id'), array_keys($changes)) ){
610 if( array_key_exists('user_id', $changes) ){
611 $refresh_keys2[] = $changes['user_id'] ? 'use-' . $changes['user_id'] : 'use-0';
612 }
613 else {
614 $refresh_keys2[] = $model->user_id ? 'use-' . $model->user_id : 'use-0';
615 }
616
617 if( array_key_exists('location_id', $changes) ){
618 $refresh_keys2[] = $changes['location_id'] ? 'loc-' . $changes['location_id'] : 'loc-0';
619 }
620 else {
621 $refresh_keys2[] = $model->location_id ? 'loc-' . $model->location_id : 'loc-0';
622 }
623
624 if( array_key_exists('date', $changes) ){
625 $refresh_keys2[] = $changes['date'] ? 'dat-' . $changes['date'] : 'dat-0';
626 }
627 else {
628 $refresh_keys2[] = 'dat-' . $model->date;
629 }
630 }
631
632 if( array_intersect(array('date_end', 'user_id', 'location_id'), array_keys($changes)) ){
633 if( array_key_exists('user_id', $changes) ){
634 $refresh_keys3[] = $changes['user_id'] ? 'use-' . $changes['user_id'] : 'use-0';
635 }
636 else {
637 $refresh_keys3[] = $model->user_id ? 'use-' . $model->user_id : 'use-0';
638 }
639
640 if( array_key_exists('location_id', $changes) ){
641 $refresh_keys3[] = $changes['location_id'] ? 'loc-' . $changes['location_id'] : 'loc-0';
642 }
643 else {
644 $refresh_keys3[] = $model->location_id ? 'loc-' . $model->location_id : 'loc-0';
645 }
646
647 if( array_key_exists('date_end', $changes) ){
648 $refresh_keys3[] = $changes['date_end'] ? 'dat-' . $changes['date_end'] : 'dat-0';
649 }
650 else {
651 $refresh_keys3[] = 'dat-' . $model->date_end;
652 }
653 }
654 }
655
656 if( $refresh_keys2 ){
657 $parent_refresh2 = HC_Lib::get_combinations($refresh_keys2);
658 $parent_refresh = array_merge( $parent_refresh, $parent_refresh2 );
659 }
660
661 if( $refresh_keys3 ){
662 $parent_refresh3 = HC_Lib::get_combinations($refresh_keys3);
663 $parent_refresh = array_merge( $parent_refresh, $parent_refresh3 );
664 }
665
666 $final_parent_refresh = array();
667 foreach( $parent_refresh as $pr ){
668 $final_parent_refresh[ join('-', $pr) ] = 1;
669 }
670
671 // $return = array_keys( $final_parent_refresh );
672 $return = $final_parent_refresh;
673 return $return;
674 }
675 }