![]() 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/Services/ |
<?php namespace Corals\Modules\Timesheet\Services; use Carbon\Carbon; use Corals\Foundation\Services\BaseServiceClass; use Corals\Modules\Timesheet\Facades\Timesheet; use Corals\Modules\Timesheet\Models\Activity; use Corals\Modules\Timesheet\Models\Entry; use Corals\Modules\Timesheet\Models\Project; use Corals\Modules\Timesheet\Models\TimeOffRequest; use Corals\Modules\Timesheet\Reports\LimitedActivitiesReport; use Corals\Settings\Facades\Settings; use Corals\User\Models\User; class TimeOffRequestService extends BaseServiceClass { public function preStore($request, &$additionalData) { $teamProject = Project::query()->where('id', '=', Settings::get('team_project_id'))->firstOrFail(); if (!$teamProject) { throw new \Exception('Team project is missing, check with administration'); } $additionalData = [ 'project_id' => $teamProject->id, 'user_id' => user()->id ]; } public function getFormData(): array { $limitedActivities = []; Activity::query()->where('is_limited', 1) ->each(function (Activity $activity) use (&$limitedActivities) { $limitedActivities[] = ['label' => $activity->title, 'value' => $activity->id]; }); $users = Timesheet::getUsersFormData('member'); return [ 'limited_activities' => $limitedActivities, 'users' => $users, 'status_options' => apiPluck(config('timesheet.models.timeOffRequest.status_options'), 'id', 'label'), ]; } public function approveRequest($time_off_request) { $user = User::findOrFail($time_off_request->user_id); $working_hours = Settings::get('total_working_hours_per_day'); $working_minutes = 0; if (Carbon::parse($time_off_request->start_date)->eq($time_off_request->end_date)) { if ($time_off_request->hours != null) { $working_hours = $time_off_request->hours; } if ($time_off_request->minutes != null) { $working_minutes = $time_off_request->minutes; } } $time_off_requestID = $time_off_request->id; $entry_data = [ 'activity_id' => $time_off_request->activity_id, 'user_id' => $time_off_request->user_id, 'project_id' => $time_off_request->project_id, 'has_reviewed' => true, 'description' => $time_off_request->notes, 'hours' => $working_hours, 'minutes' => $working_minutes, ]; $properties = $this->setNumberOfDaysAndEntries($time_off_request, 'approve', $entry_data); TimeOffRequest::query()->where('timesheet_time_off_requests.id', '=', $time_off_requestID) ->update([ 'status' => 'approved', 'properties' => $properties, ]); event('notifications.time_off_request.approved', ['user' => $user, 'time_off_request' => $time_off_request]); Timesheet::notifyAdministrationRoles(); } public function rejectRequest($request, $time_off_request) { $user = User::findOrFail($time_off_request->user_id); $time_off_request->update([ 'status' => 'rejected', 'reject_reason' => $request->get('reject_reason') ]); event('notifications.time_off_request.rejected', ['user' => $user, 'time_off_request' => $time_off_request]); Timesheet::notifyAdministrationRoles(); } public function postStoreUpdate($request, &$additionalData) { $time_off_request = $this->model; $user = User::findOrFail($time_off_request->user_id); $properties = $this->setNumberOfDaysAndEntries($time_off_request); $request->replace(array_merge($request->all(), ['year' => Carbon::parse($time_off_request->start_date)->year])); $limited_activity_data = (new LimitedActivitiesReport())->getLimitedActivityDataForUser($request); if (!empty($limited_activity_data['limited_activities'])) { $properties['remaining_days_for_activity'] = $limited_activity_data['limited_activities'][$time_off_request->activity_id]['remaining_days']; } else { $properties['remaining_days_for_activity'] = 'N/A'; } $time_off_request->update([ 'properties' => $properties ]); if ($time_off_request->wasChanged()) { event('notifications.time_off_request.request', ['user' => $user, 'time_off_request' => $time_off_request]); } Timesheet::notifyAdministrationRoles(); } protected function setNumberOfDaysAndEntries($time_off_request, $action = '', $entry_data = []) { $properties = $time_off_request->properties ?? []; $properties['number_of_days'] = 0; $request_start_date = Carbon::parse($time_off_request->start_date); $request_end_date = Carbon::parse($time_off_request->end_date); $working_days = Settings::get('working_days'); $hours = $time_off_request->hours; $minutes = $time_off_request->minutes; $totalWorkingHoursPerDay = Settings::get('total_working_hours_per_day'); while ($request_start_date->copy()->lte($request_end_date)) { if (in_array($request_start_date->shortDayName, $working_days)) { if ($hours > 0 || $minutes > 0) { if (!$hours) { $hours = (int)($minutes / 60); } $properties['number_of_days'] = number_format($hours / $totalWorkingHoursPerDay, 2); } else { $properties['number_of_days']++; } if ($action == 'approve') { $entry_to_date_insert = array_merge($entry_data, [ 'spent_at' => $request_start_date ]); Entry::create($entry_to_date_insert); } } $request_start_date->addDay(); } return $properties; } public function postDestroy($request) { Timesheet::notifyAdministrationRoles(); } }