![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/ts.corals.io/corals-api/Corals/modules/Timesheet/Reports/ |
<?php namespace Corals\Modules\Timesheet\Reports; use Corals\Modules\Timesheet\Models\Client; use Corals\Modules\Timesheet\Models\Entry; use Illuminate\Http\Request; class ActivitiesReportPerLevel { public function getBaseActivityQuery($start_date, $end_date) { return Entry::query() ->selectRaw(" ((SUM(ifNull(timesheet_entries.hours*60,0)) + SUM(ifNull(timesheet_entries.minutes,0)))/60) as total_time, ((SUM(ifNull(timesheet_entries.evaluation_hours*60,0)) + SUM(ifNull(timesheet_entries.evaluation_minutes,0)))/60) as evaluation_time, timesheet_entries.activity_id, timesheet_activities.title, timesheet_activities.billable as activity_is_billable, timesheet_entries.user_id, timesheet_entries.hourly_rate, timesheet_projects.type as project_type, timesheet_entries.project_id, (SUM(timesheet_entries.amount)) as total_amount, (SUM(timesheet_entries.cost)) as total_cost") ->join('timesheet_activities', 'timesheet_activities.id', '=', 'timesheet_entries.activity_id') ->join('timesheet_projects', 'timesheet_projects.id', '=', 'timesheet_entries.project_id') ->whereBetween('timesheet_entries.spent_at', [$start_date, $end_date]) ->groupBy('timesheet_activities.id', 'timesheet_projects.type'); } public function getActivitiesPerLevel(Request $request): array { $billable_activities = []; $non_billable_activities = []; $start_date = $request->get('from_date', now()->subMonth()->startOfMonth()); $end_date = $request->get('to_date', now()->subMonth()->endOfMonth()); $project_id = $request->get('project_id'); $client_id = $request->get('client_id'); $user_id = $request->get('user_id'); $header_for_billable_activity = [ 'billable_activities' => 'Activity', 'hours' => 'Hours', 'evaluation_hours' => 'Evaluation', 'billable_amount' => 'Billable', 'cost' => 'Cost', 'balance' => 'Balance' ]; $header_for_non_billable_activity = [ 'non_billable_activities' => 'Activity', 'hours' => 'Hours', 'cost' => 'Cost' ]; $footer_billable_activities = [ 'total' => 'Total', 'total_hours' => 0, 'total_evaluation_hours' => 0, 'total_billable_amount' => 0, 'total_cost' => 0, 'total_balance' => 0 ]; $footer_non_billable_activities = [ 'total' => 'Total', 'total_hours' => 0, 'total_cost' => 0 ]; $billable_activities['header'] = $header_for_billable_activity; $non_billable_activities['header'] = $header_for_non_billable_activity; if (!is_null($project_id)) { $activitiesWithEntries = $this->getBaseActivityQuery($start_date, $end_date)->where('timesheet_entries.project_id', $project_id)->get(); } elseif (!is_null($client_id)) { $projects_for_client = Client::findOrFail($client_id)->projects->pluck('id'); $activitiesWithEntries = $this->getBaseActivityQuery($start_date, $end_date)->whereIn('timesheet_entries.project_id', $projects_for_client)->get(); } elseif (!is_null($user_id)) { $activitiesWithEntries = $this->getBaseActivityQuery($start_date, $end_date)->where('timesheet_entries.user_id', $user_id)->get(); } else { $activitiesWithEntries = []; } foreach ($activitiesWithEntries as $activity) { if ($activity->total_time == 0) { continue; } if ($activity->project_type !== 'non_billable' && $activity->activity_is_billable) { $billable_activities['activity_' . $activity->activity_id]['title'] = $activity->title; $billable_activities['activity_' . $activity->activity_id]['hours'] = $activity->total_time; $billable_activities['activity_' . $activity->activity_id]['evaluation_hours'] = $activity->evaluation_time; $billable_activities['activity_' . $activity->activity_id]['billable_amount'] = $activity->total_amount; $billable_activities['activity_' . $activity->activity_id]['cost'] = $activity->total_cost; $billable_activities['activity_' . $activity->activity_id]['balance'] = $activity->total_amount - $activity->total_cost; $footer_billable_activities['total_hours'] += $activity->total_time; $footer_billable_activities['total_evaluation_hours'] += $activity->evaluation_time; $footer_billable_activities['total_billable_amount'] += $activity->total_amount; $footer_billable_activities['total_cost'] += $activity->total_cost; $footer_billable_activities['total_balance'] += $billable_activities['activity_' . $activity->activity_id]['balance']; } else { $non_billable_activities['activity_' . $activity->activity_id]['title'] = $activity->title; $non_billable_activities['activity_' . $activity->activity_id]['hours'] = $activity->total_time; $non_billable_activities['activity_' . $activity->activity_id]['cost'] = $activity->total_cost; $footer_non_billable_activities['total_hours'] += $activity->total_time; $footer_non_billable_activities['total_cost'] += $activity->total_cost; } } if (count($billable_activities) === 1) { $billable_activities['no_data'] = []; } else { $billable_activities['footer'] = $footer_billable_activities; } if (count($non_billable_activities) === 1) { $non_billable_activities['no_data'] = []; } else { $non_billable_activities['footer'] = $footer_non_billable_activities; } return roundResults([ 'billable_activities' => $billable_activities, 'non_billable_activities' => $non_billable_activities, ]); } }