![]() 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/Classes/ |
<?php namespace Corals\Modules\Timesheet\Classes; use Carbon\Carbon; use Corals\Modules\Timesheet\Events\AlertsEvent; use Corals\Modules\Timesheet\Models\Activity; use Corals\Modules\Timesheet\Models\Client; use Corals\Modules\Timesheet\Models\Entry; use Corals\Modules\Timesheet\Models\Project; use Corals\Modules\Timesheet\Models\SavedFilter; use Corals\Modules\Utility\Models\Category\Category; use Corals\User\Models\Role; use Corals\User\Models\User; use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; class Timesheet { /** * @param $hours * @param $minutes * @return string */ public function formatHoursAndMinutes($hours, $minutes): string { if (($minutes % 60) === 0) { $hours += $minutes / 60; $minutes = 0; } else { $extraMinutes = $minutes > 59 ? $minutes % 60 : 0; if ($extraMinutes) { $extraHours = ($minutes - $extraMinutes) / 60; $hours += $extraHours; $minutes = $extraMinutes; } } return sprintf("%02d:%02d", $hours, $minutes); } public function isTimesheetAdministration(User $user = null) { if (is_null($user)) { $user = user(); } if (!$user) { return false; } return isSuperUser($user) || $user->hasPermissionTo('Administrations::admin.timesheet'); } /** * @param array $parameters * @return array */ public function getProjectsFormData(array $parameters = []) { $projects = Project::query() ->select('timesheet_projects.*') ->when(data_get($parameters, 'assignable'), function ($q) { $q->where('timesheet_projects.assignable', true); })->when(data_get($parameters, 'logged_in_user') && !\Corals\Modules\Timesheet\Facades\Timesheet::isTimesheetAdministration(), function ($q) { $q->leftJoin('timesheet_project_user', function ($joinAssignmentProject) { $joinAssignmentProject->on('timesheet_projects.id', 'timesheet_project_user.project_id'); })->where('timesheet_project_user.user_id', user()->id) ->orWhere('timesheet_projects.assignable', false); })->groupBy('timesheet_projects.id') ->orderBy('timesheet_projects.client_id') ->orderBy('timesheet_projects.id') ->get(); $projectsArray = []; $projects->groupBy('client_id') ->each(function ($projects, $client_id) use (&$projectsArray) { $client = Client::find($client_id); $projectsArray[] = [ 'group' => true, 'label' => $client->name, 'code' => $client->id, 'status' => $client->status, 'is_group_empty' => !count($projects), 'empty_group_message' => "No Options!", 'notSelectable' => true ]; foreach ($projects as $project) { $projectsArray[] = [ 'label' => $project->name, 'value' => $project->id, 'group' => $client->id, 'group_label' => $client->name, 'billable' => $project->billable, 'status' => $project->status ]; } }); return $projectsArray; } /** * @return array */ public function getUsersFormData($role = null) { $users = User::query() ->selectRaw("concat(users.name,' ',users.last_name,', ',users.email, (CASE WHEN users.status = 'inactive' THEN ' (Inactive)' ELSE '' END)) as label,hourly_rate,id as value,id"); if ($role) { $users->whereHas('roles', function (Builder $query) use ($role) { $query->where('roles.name', $role); }); } $users->when(!$this->isTimesheetAdministration(), function ($query) { $query->where('id', user()->id); }); return $users->get(); } public function getUsersPerProjectsOrClientFormData(Request $request, $role = null) { $project_ids = $request->filled('project_ids') && !is_array($request->get('project_ids')) ? explode(',', $request->get('project_ids')) : null; $client_ids = $request->filled('client_ids') && !is_array($request->get('client_ids')) ? explode(',', $request->get('client_ids')) : null; $users = User::query() ->distinct() ->when($client_ids, function ($query) use ($client_ids) { $query->join('timesheet_project_user', 'users.id', '=', 'timesheet_project_user.user_id') ->join('timesheet_projects', 'timesheet_project_user.project_id', '=', 'timesheet_projects.id') ->whereIn('timesheet_projects.client_id', $client_ids); })->when($project_ids, function ($query) use ($project_ids) { $query->join('timesheet_project_user', 'users.id', '=', 'timesheet_project_user.user_id') ->whereIn('timesheet_project_user.project_id', $project_ids); })->selectRaw("concat(users.name,' ',users.last_name,', ',users.email, (CASE WHEN users.status = 'inactive' THEN ' (Inactive)' ELSE '' END)) as label,users.hourly_rate,users.id as value,users.id"); if ($role) { $users->whereHas('roles', function (Builder $query) use ($role) { $query->where('roles.name', $role); }); } $users->when(!$this->isTimesheetAdministration(), function ($query) { $query->where('users.id', user()->id); }); return $users->get(); } public function getClientsFormData() { return Client::query() ->selectRaw("name as label,id as value") ->get(); } /** * @param $parentSlug * @return array */ public function getCategoriesFormData($parentsSlug = []) { $categoriesArray = []; foreach ($parentsSlug as $parentSlug) { $parentCategory = Category::query() ->where('slug', '=', $parentSlug) ->first(); $categoriesArray[] = [ 'group' => true, 'label' => $parentCategory->name, 'code' => $parentCategory->id, 'status' => $parentCategory->status, 'is_group_empty' => !count($parentCategory->children), 'empty_group_message' => "No Options!", 'notSelectable' => true ]; foreach ($parentCategory->children as $category) { $categoriesArray[] = [ 'label' => $category->name, 'value' => $category->id, 'group' => $parentCategory->id, 'group_label' => $parentCategory->name, 'status' => $category->status ]; } } return $categoriesArray; } public function getBillCycleStartsAt($object) { if (!$object->bill_cycle) { return null; } $bill_cycle_starts_at = $object->bill_cycle_starts_at; if (is_null($bill_cycle_starts_at)) { return null; } switch ($object->bill_cycle) { case 'weekly': return Carbon::getDays()[$bill_cycle_starts_at] ?? $bill_cycle_starts_at; default: return $object->bill_cycle_starts_at; } } /** * @param User $user * @param Client $client * @return bool */ public function isClientBelongsToUser(User $user, Client $client) { $userClients = $this->getUserClients($user, false) ->pluck('id') ->toArray(); return in_array($client->id, $userClients); } /** * @param User $user * @param bool $first * @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection|\Illuminate\Database\Eloquent\Model|object|null */ public function getUserClients(User $user, bool $first = true) { $clients = Client::query() ->join('timesheet_client_user', 'timesheet_clients.id', 'timesheet_client_user.client_id') ->where('timesheet_client_user.user_id', $user->id) ->select('timesheet_clients.*'); return $first ? $clients->first() : $clients->get(); } public function totalEvaluationTime($entries) { $evaluationHours = 0; $evaluationMinutes = 0; for ($i = 0; $i < count($entries); $i++) { for ($j = 0; $j < count($entries[$i]); $j++) { $evaluationHours += $entries[$i][$j]['evaluation_hours'] ?: 0; $evaluationMinutes += $entries[$i][$j]['evaluation_minutes'] ?: 0; } } if ($evaluationMinutes >= 60) { $evaluationHours += floor($evaluationMinutes / 60); $evaluationMinutes = $evaluationMinutes % 60; } if ($evaluationMinutes < 10) { $evaluationMinutes = "0" . $evaluationMinutes; } if ($evaluationHours < 10) { $evaluationHours = "0" . $evaluationHours; } return $evaluationHours . ':' . $evaluationMinutes; } public function getEntryHourlyRate($project, $user_id, $activity_id, $evaluationTime) { $hourly_rate = 0; $amount = 0; if (!is_object($project)) { $project = Project::findOrFail($project); } $activity = Activity::findOrFail($activity_id); if (!$activity->billable) { $project->type = 'non_billable'; } switch ($project->type) { case 'fixed_fee': case 'time_and_materials': if ($project->bill_by === 'project_billable_rate') { $project_rate = $project->hourly_rate; $hourly_rate = $project_rate; $amount = $hourly_rate * $evaluationTime; } elseif ($project->bill_by === 'person_billable_rate') { $user_rate = DB::table('timesheet_project_user') ->where('user_id', $user_id) ->where('project_id', $project->id)->first()->user_rate; $hourly_rate = $user_rate; $amount = $hourly_rate * $evaluationTime; } else { $activity_rate = DB::table('timesheet_project_activity') ->where('activity_id', $activity_id) ->where('project_id', $project->id)->first()->activity_rate; $hourly_rate = $activity_rate; $amount = $hourly_rate * $evaluationTime; } break; case 'non_billable': $hourly_rate = 0; $amount = $hourly_rate * $evaluationTime; break; } return [ 'hourly_rate' => $hourly_rate, 'amount' => $amount ]; } public function getEntryTotalHours(Entry $entry) { if (!is_null($entry->evaluation_hours) || !is_null($entry->evaluation_minutes)) { $hours = $entry->evaluation_hours ?? 0; $minutes = $entry->evaluation_minutes ?? 0; } else { $hours = $entry->hours; $minutes = $entry->minutes; } return $hours + ($minutes / 60); } public function notifyAdministrationRoles() { Role::query()->whereHas('permissions', function ($query) { $query->where('permissions.name', 'Administrations::admin.timesheet'); })->eachById(function ($role) { event(new AlertsEvent($role)); }); } public function getSavedFilters() { return SavedFilter::query() ->where('user_id', \user()->id) ->selectRaw("name as label,id as value,filter") ->get(); } }