Guest User

Timesheet Controller

a guest
Oct 4th, 2013
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 10.40 KB | None | 0 0
  1. <?php
  2.  
  3. class Timesheet_Controller extends Base_Controller {
  4.  
  5.     public $restful = true;
  6.  
  7.     public function post_edit($id) {
  8.         if($this->currentUser->can('update_timesheet')) {
  9.             $input = Input::get();
  10.             $rules = array(
  11.                 'job_id' => 'required|exists:jobs,id',
  12.                 'employee_id' => 'required|exists:employees,id',
  13.                 'start_time' => 'required',
  14.                 'end_time' => 'required_with:start_time',
  15.                 'date' => 'required'
  16.             );
  17.  
  18.             $validation = Validator::make($input, $rules);
  19.            
  20.             if(!Empty($input['ajax'])) {
  21.                 $ajax = $input['ajax'];
  22.                 unset($input['ajax']);
  23.             } else {
  24.                 $ajax = null;
  25.                 unset($input['ajax']);
  26.             }
  27.  
  28.             if($validation->passes()) {
  29.                 $start_time = date('Y-m-d H:i:s', strtotime($input['date'].' '.$input['start_time']));
  30.                 //echo 'start_time: '.$start_time;
  31.                 $end_time = date('Y-m-d H:i:s', strtotime($input['date'].' '.$input['end_time']));
  32.  
  33.                 if($input['end_time'] == '00:00') {
  34.                     $tempDate = date_create($input['date']);
  35.                     date_add($tempDate, date_interval_create_from_date_string('1 day'));
  36.                     $end_time = date('Y-m-d H:i:s', strtotime(date_format($tempDate, 'Y-m-d').' '.$input['end_time']));
  37.                 }
  38.                
  39.                 $scopeTimeWorked = strtotime($end_time) - strtotime($start_time);
  40.                 $scopeHours = $scopeTimeWorked/3600;
  41.                 $scopeYear = date('Y', strtotime($input['date']));
  42.                 $scopeWeek = date('W', strtotime($input['date']));
  43.                 $scopeDayOfWeek = date('w', strtotime($input['date']));
  44.                 $scopeTimesheets = array();
  45.  
  46.                 $timesheets = Timesheet::where('employee_id', '=', $input['employee_id'])->get();
  47.                 if(!Empty($timesheets)) {
  48.                     foreach($timesheets as $timesheet) {
  49.                         $thisYear = date('Y', strtotime($timesheet->date));
  50.                         $thisWeek = date('W', strtotime($timesheet->date));
  51.                         $thisDayOfWeek = date('w', strtotime($timesheet->date));
  52.                         $thisID = $timesheet->id;
  53.                         // Exclude the timesheet we're editing from the current hour calculations
  54.                         if($thisID != $id && $thisID < $id) {
  55.                             if($thisYear == $scopeYear && $thisWeek == $scopeWeek && $thisDayOfWeek == $scopeDayOfWeek) {
  56.                                 $scopeTimesheets[] = $timesheet;
  57.                             }
  58.                         }
  59.                     }
  60.                     if(!Empty($scopeTimesheets)) {
  61.                         $previousTotal = 0;
  62.                         foreach($scopeTimesheets as $timesheet) {
  63.                             $timeWorked = strtotime($timesheet->end_time) - strtotime($timesheet->start_time);
  64.                             $ot_start_time = $timesheet->ot_start_time;
  65.                             if(!Empty($ot_start_time)) {
  66.                                 $otWorked = strtotime($timesheet->ot_end_time) - strtotime($timesheet->ot_start_time);
  67.                             } else {
  68.                                 $otWorked = 0;
  69.                             }
  70.                             $hours = $timeWorked/3600;
  71.                             $otHours = $otWorked/3600;
  72.                             $previousTotal += $hours + $otHours;
  73.                         }
  74.                         if($previousTotal >= 8) {
  75.                             $input['ot_start_time'] = $input['start_time'];
  76.                             $input['ot_end_time'] = $input['end_time'];
  77.                             $input['start_time'] = '0000-00-00 00:00:00';
  78.                             $input['end_time'] = '0000-00-00 00:00:00';
  79.                         } else if(($previousTotal + $scopeHours) >= 8) {
  80.                             $newTotal = $previousTotal + $scopeHours;
  81.                             $overtimeHours = $newTotal - 8;
  82.                             $regularHours = $scopeHours - $overtimeHours;
  83.                             $input['start_time'] = $start_time;
  84.                             $input['ot_end_time'] = $end_time;
  85.  
  86.                             $tempDate = date_create($input['ot_end_time']);
  87.                             $intervalParts = explode('.', $overtimeHours);
  88.                             $intervalHours = $intervalParts[0];
  89.                             if(!Empty($intervalParts[1])) {
  90.                                 $intervalMinutes = $intervalParts[1];
  91.                                 $intervalMinutes = '.'.$intervalMinutes;
  92.                                 $intervalMinutes *= 60;
  93.                                 $intervalMinutes = number_format($intervalMinutes, '0', '', '');
  94.                             } else {
  95.                                 $intervalMinutes = 0;
  96.                             }
  97.                             date_sub($tempDate, date_interval_create_from_date_string($intervalHours.' hours + '.$intervalMinutes.' minutes'));
  98.                            
  99.                             $input['end_time'] = date_format($tempDate, 'Y-m-d H:i:s');//date('Y-m-d H:i:s', strtotime($input['ot_end_time'].'-'.$overtimeHours.' hours'));
  100.                             $input['ot_start_time'] = date_format($tempDate, 'Y-m-d H:i:s');//date('Y-m-d H:i:s', strtotime($input['ot_end_time'].'-'.$overtimeHours.' hours'));
  101.                         } else {
  102.                             $input['start_time'] = $start_time;
  103.                             $input['end_time'] = $end_time;
  104.                             $input['ot_start_time'] = NULL;
  105.                             $input['ot_end_time'] = NULL;
  106.                         }
  107.                     } else {
  108.                         $timeWorked = strtotime($end_time) - strtotime($start_time);
  109.                         $hours = $timeWorked/3600;
  110.                         if($hours > 8) {
  111.                             $otHours = $hours - 8;
  112.                             $input['start_time'] = $start_time;
  113.                             $input['ot_end_time'] = $end_time;
  114.                             $tempDate = date_create($input['ot_end_time']);
  115.                             $intervalParts = explode('.', $otHours);
  116.                             $intervalHours = $intervalParts[0];
  117.                             if(!Empty($intervalParts[1])) {
  118.                                 $intervalMinutes = $intervalParts[1];
  119.                                 $intervalMinutes = '.'.$intervalMinutes;
  120.                                 $intervalMinutes *= 60;
  121.                                 $intervalMinutes = number_format($intervalMinutes, '0', '', '');
  122.                             } else {
  123.                                 $intervalMinutes = 0;
  124.                             }
  125.                             date_sub($tempDate, date_interval_create_from_date_string($intervalHours.' hours + '.$intervalMinutes.' minutes'));
  126.  
  127.                             $input['end_time'] = date_format($tempDate, 'Y-m-d H:i:s');//date('Y-m-d H:i:s', strtotime($input['ot_end_time'].' -'.$otHours.' hours'));
  128.                             $input['ot_start_time'] = date_format($tempDate, 'Y-m-d H:i:s');//date('Y-m-d H:i:s', strtotime($input['ot_end_time'].' -'.$otHours.' hours'));
  129.                         } else {
  130.                             //echo 'start_time: '.$start_time;
  131.                             $input['start_time'] = $start_time;
  132.                             $input['end_time'] = $end_time;
  133.                             $input['ot_start_time'] = NULL;
  134.                             $input['ot_end_time'] = NULL;
  135.                         }
  136.                     }
  137.                 } else {
  138.                     $timeWorked = strtotime($end_time) - strtotime($start_time);
  139.                     $hours = $timeWorked/3600;
  140.                     if($hours > 8) {
  141.                         $otHours = $hours - 8;
  142.                         $input['start_time'] = $start_time;
  143.                         $input['ot_end_time'] = $end_time;
  144.  
  145.                         $tempDate = date_create($input['ot_end_time']);
  146.                         $intervalParts = explode('.', $otHours);
  147.                         $intervalHours = $intervalParts[0];
  148.                         if(!Empty($intervalParts[1])) {
  149.                             $intervalMinutes = $intervalParts[1];
  150.                             $intervalMinutes = '.'.$intervalMinutes;
  151.                             $intervalMinutes *= 60;
  152.                             $intervalMinutes = number_format($intervalMinutes, '0', '', '');
  153.                         } else {
  154.                             $intervalMinutes = 0;
  155.                         }
  156.                         date_sub($tempDate, date_interval_create_from_date_string($intervalHours.' hours + '.$intervalMinutes.' minutes'));
  157.  
  158.                         $input['end_time'] = date_format($tempDate, 'Y-m-d H:i:s');//date('Y-m-d H:i:s', strtotime($input['ot_end_time'].' -'.$otHours.' hours'));
  159.                         $input['ot_start_time'] = date_format($tempDate, 'Y-m-d H:i:s');//date('Y-m-d H:i:s', strtotime($input['ot_end_time'].' -'.$otHours.' hours'));
  160.                     } else {
  161.                         $input['start_time'] = $start_time;
  162.                         $input['end_time'] = $end_time;
  163.                         $input['ot_start_time'] = NULL;
  164.                         $input['ot_end_time'] = NULL;
  165.                     }
  166.                 }
  167.  
  168.                 $timesheet = Timesheet::find($id);
  169.                 //$timesheet->fill_raw($input);
  170.                 $timesheet->job_id = $input['job_id'];
  171.                 $timesheet->employee_id = $input['employee_id'];
  172.                 $timesheet->start_time = $input['start_time'];
  173.                 $timesheet->end_time = $input['end_time'];
  174.                 $timesheet->ot_start_time = $input['ot_start_time'];
  175.                 $timesheet->ot_end_time = $input['ot_end_time'];
  176.                 $timesheet->date = $input['date'];
  177.                 $timesheet->comments = $input['comments'];
  178.                 //echo 'final start: '.$timesheet->start_time;
  179.                 $timesheet->save();
  180.  
  181.                 $employee = Employee::find($timesheet->employee_id);
  182.                 $hourly_rate = $employee->hourly_rate;
  183.  
  184.                 if(isset($timesheet->ot_end_time) && !Empty($timesheet->ot_end_time) && $timesheet->ot_end_time != '') {
  185.                     $otWorked = strtotime($timesheet->ot_end_time) - strtotime($timesheet->ot_start_time);
  186.                 } else {
  187.                     $otWorked = 0;
  188.                 }
  189.                 if(isset($timesheet->end_time) && !Empty($timesheet->end_time) && $timesheet->end_time != '') {
  190.                     $hoursWorked = (strtotime($timesheet->end_time) - strtotime($timesheet->start_time))/3600;
  191.                 } else {
  192.                     $hoursWorked = 0;
  193.                 }
  194.                 $otHours = $otWorked/3600;
  195.                 $cost = round($hoursWorked * $hourly_rate, 2);
  196.                 $cost += round($otHours * ($hourly_rate * 1.5), 2);
  197.  
  198.                 $employeeCost = EmployeeCost::find($timesheet->cost->id);
  199.                 $employeeCost->fill_raw(array(
  200.                     'hours' => $hoursWorked,
  201.                     'ot_hours' => $otHours,
  202.                     'cost' => $cost
  203.                 ));
  204.                 $employeeCost->save();
  205.  
  206.                 $costType = CostType::where('title', '=', 'employee')->first();
  207.                 $jobCost = $employeeCost->jobcost()->where('cost_type_id', '=', $costType->id)->first();
  208.                 $jobCost->job_id = $input['job_id'];
  209.                 $jobCost->save();
  210.  
  211.                 $interaction = new Interaction(
  212.                     array(
  213.                         'employee_id' => $this->currentUser->employee->id,
  214.                         'table' => 'timesheets',
  215.                         'row' => $id,
  216.                         'data' => json_encode($timesheet->to_array())
  217.                     )
  218.                 );
  219.                 $interaction->save();
  220.                 $otherInteraction = new Interaction(
  221.                     array(
  222.                         'employee_id' => $this->currentUser->employee->id,
  223.                         'table' => 'employeecosts',
  224.                         'row' => $employeeCost->id,
  225.                         'data' => json_encode($employeeCost->to_array())
  226.                     )
  227.                 );
  228.                 $otherInteraction->save();
  229.                 $costInteraction = new Interaction(
  230.                     array(
  231.                         'employee_id' => $this->currentUser->employee->id,
  232.                         'table' => 'costs',
  233.                         'row' => $jobCost->id,
  234.                         'data' => json_encode($jobCost->to_array())
  235.                     )
  236.                 );
  237.                 $costInteraction->save();
  238.  
  239.                 Input::clear();
  240.                 //echo 'other start: '.$timesheet->start_time;
  241.                 if(!Empty($ajax)) {
  242.                     echo 'success';
  243.                     exit();
  244.                 } else {
  245.                     return Redirect::to('timesheet/'.$id);
  246.                 }
  247.             } else {
  248.                 $badInput = array();
  249.                 if($validation->errors->has('client_id')) { $badInput[] = 'client_id'; }
  250.                 if($validation->errors->has('employee_id')) { $badInput[] = 'employee_id'; }
  251.                 if($validation->errors->has('start_time')) { $badInput[] = 'start_time'; }
  252.                 if($validation->errors->has('end_time')) { $badInput[] = 'end_time'; }
  253.                 if($validation->errors->has('date')) { $badInput[] = 'date'; }
  254.                 if($validation->errors->has('comments')) { $badInput[] = 'comments'; }
  255.                 if(!Empty($ajax)) {
  256.                     echo json_encode($badInput);
  257.                     exit();
  258.                 } else {
  259.                     return Redirect::to('timesheet/'.$id.'/edit')->with_input('except', $badInput)->with_errors($validation);
  260.                 }
  261.             }
  262.         } else {
  263.             Session::flash('status', "You don't have permission to access that page.");
  264.             return Redirect::to('/');
  265.         }
  266.     }
  267. }
  268. ?>
Advertisement
Add Comment
Please, Sign In to add comment