SettingsHelper = new SettingsHelper(); } public function utilization(Request $request){ $view = view('reporting::utilization'); $from = Carbon::now()->startOfMonth()->format('Y-m-d 00:00:00'); $to = Carbon::now()->format('Y-m-d 23:59:59'); $conds = $this->SettingsHelper->defaultConds($from,$to); if($request->has('daterange')){ $range = explode(' - ',$request->daterange); $filter_from = new Carbon($range[0]); $conds['from'] = $filter_from->format('Y-m-d 00:00:00'); $filter_to = new Carbon($range[1]); $conds['to'] = $filter_to->format('Y-m-d 23:59:59'); } if ($request->ajax()) { $expected_day_work_hours = 7; $expected_work_days = 22; $expected_total_hours = $expected_work_days*$expected_day_work_hours; $user = auth()->user(); $company_users = User::where('company_id',$user->company_id)->visibleInReports()->pluck('id'); $raw_log = DB::table('activity_log') ->whereBetween('created_at',[$conds['from'],$conds['to']]) ->whereIn('causer_id',$company_users) ->where(['subject_type' => 'Modules\Platform\User\Entities\User','log_name' => 'login-logout']) ->orderBy('created_at','ASC') ->get(); $stats = []; $agents_raw = []; $agents_ids = []; foreach($raw_log as $entry){ if(!in_array($entry->causer_id,$agents_ids)){ $agents_ids[] = $entry->causer_id; } $action_date = $entry->created_at; $carbonied_date = new Carbon($action_date); $date = $carbonied_date->format('Y-m-d'); if($entry->description == 'LOGGED_IN'){ if(empty($stats[$entry->causer_id][$date][$entry->description])){ $stats[$entry->causer_id][$date][$entry->description] = $action_date; } }elseif($entry->description == 'LOGGED_OUT'){ $stats[$entry->causer_id][$date][$entry->description] = $action_date; } // Fill the non-logged out enterance with zero seconds difference (Same timestamp) if(empty($stats[$entry->causer_id][$date]['LOGGED_OUT'])){ $stats[$entry->causer_id][$date]['LOGGED_OUT'] = $action_date; } $carbonized_logged_in = new Carbon(@$stats[$entry->causer_id][$date]['LOGGED_IN']); $carbonized_logged_out = new Carbon(@$stats[$entry->causer_id][$date]['LOGGED_OUT']); $stats[$entry->causer_id][$date]['WORKED_MINUTES'] = $carbonized_logged_in->diffInMinutes($carbonized_logged_out); @$agents_raw[$entry->causer_id]['TOTAL_WORKED_MINUTES'] += $stats[$entry->causer_id][$date]['WORKED_MINUTES']; if($stats[$entry->causer_id][$date]['WORKED_MINUTES'] > 0){ @$agents_raw[$entry->causer_id]['TOTAL_WORKED_DAYS'] += 1; @$agents_raw[$entry->causer_id]['MISSED_WORKED_DAYS'] += 0; }else{ @$agents_raw[$entry->causer_id]['TOTAL_WORKED_DAYS'] += 0; @$agents_raw[$entry->causer_id]['MISSED_WORKED_DAYS'] += 1; } } $agents = []; $agents_names = User::select(DB::raw('CONCAT(first_name," ",last_name) as full_name'),'id')->whereIn('id',$agents_ids)->get()->pluck('full_name','id')->toArray(); foreach($agents_raw as $user_id => $attrs){ $worked_hours = round(($attrs['TOTAL_WORKED_MINUTES']/60),2); $agents[$user_id]['AGENT_ID'] = $user_id; $agents[$user_id]['AGENT_NAME'] = $agents_names[$user_id]; $agents[$user_id]['TOTAL_WORKED_MINUTES'] = $attrs['TOTAL_WORKED_MINUTES']; $agents[$user_id]['TOTAL_WORKED_HOURS'] = $worked_hours; $agents[$user_id]['TOTAL_WORKED_DAYS'] = count($stats[$user_id]); $agents[$user_id]['MISSED_WORKED_DAYS'] = $attrs['MISSED_WORKED_DAYS']; $agents[$user_id]['EXPECTED_WORKED_DAYS'] = $expected_work_days; $agents[$user_id]['EXPECTED_TOTAL_HOURS'] = $expected_total_hours; $agents[$user_id]['UTILIZATION'] = round((($worked_hours/$expected_total_hours)*100),2); } $data = Datatables::of($agents)->make(true); return $data; } $filter_area = view('reporting::widgets.filter_area'); $filter_area->with('conds',$conds); $filter_area->with('submit_route',route('reporting.utilization')); $view->with('filter_area',$filter_area); $view->with('conds',$conds); return $view; } }