![]() 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/Hooks/ |
<?php namespace Corals\Modules\Timesheet\Hooks; use Carbon\Carbon; use Corals\Modules\Timesheet\Facades\Timesheet as TimesheetFacade; use Corals\Modules\Timesheet\Models\Entry; use Corals\Modules\Timesheet\Models\TimeOffRequest; use Corals\Settings\Facades\Settings; use Corals\User\Models\User; use Illuminate\Support\Facades\DB; class Timesheet { protected $dateFormat = 'D d M, Y'; public function usersAlert($data) { if (TimesheetFacade::isTimesheetAdministration()) { if (Settings::get('evaluation_enabled', true)) { $data = $this->notReviewedEntries($data); } $data = $this->pendingTimeOffRequests($data); $data = $this->usersWithoutEntries($data); } if (user()->hasRole('member') && user()->employee_type != 'part_time') { $data = $this->myMissingEntries($data); } return $data; } /** * @return array */ protected function getDatesToBeChecked(): array { $datesToBeChecked = []; $working_days = Settings::get('working_days'); $startDate = now()->subMonth()->startOfMonth(); while ($startDate->lt(today())) { if (in_array($startDate->shortDayName, $working_days)) { $datesToBeChecked [] = $startDate->toDateString(); } $startDate->addDay(); } return $datesToBeChecked; } public function notReviewedEntries($data) { $not_reviewed_entries = Entry::query() ->select('timesheet_entries.*') ->where('has_reviewed', '=', 0) ->orderBy('timesheet_entries.spent_at', 'ASC') ->get(); $not_reviewed_formatted_alert = []; foreach ($not_reviewed_entries as $not_reviewed_entry) { $not_reviewed_formatted_alert[] = [ 'message' => sprintf("%s - %s %s", $not_reviewed_entry->user->full_name, $not_reviewed_entry->present('time'), $not_reviewed_entry->present('activity')), 'action' => [ 'code' => 'nav_to_date', 'attr' => [ 'date' => $not_reviewed_entry->spent_at, 'label' => format_date($not_reviewed_entry->spent_at, $this->dateFormat), ], ] ]; } if ($not_reviewed_formatted_alert) { $data[] = [ 'message' => '<b>Entries Waiting Review</b>', 'data' => $not_reviewed_formatted_alert, 'level' => 'warning', 'icon' => 'hourglass' ]; } return $data; } public function pendingTimeOffRequests($data) { $pending_time_off_requests = TimeOffRequest::query() ->select('timesheet_time_off_requests.*') ->where('status', '=', 'pending') ->get(); $pending_time_off_requests_formatted_alert = []; foreach ($pending_time_off_requests as $request) { $pending_time_off_requests_formatted_alert[] = [ 'message' => sprintf("%s has Pending Time Off Request From %s To %s", $request->user->full_name, $request->present('start_date'), $request->present('end_date')), 'action' => [] ]; } if ($pending_time_off_requests_formatted_alert) { $data[] = [ 'message' => '<b>Pending Time Off Requests</b>', 'data' => $pending_time_off_requests_formatted_alert, 'action' => [ 'code' => 'nav_to', 'attr' => [ 'route' => 'time-off-requests', 'label' => 'Go to Time off', ], ], 'level' => 'warning', 'icon' => 'paper-plane' ]; } return $data; } public function usersWithoutEntries($data) { $usersWithoutEntries = []; foreach ($this->getDatesToBeChecked() as $date) { $missingUsersForDate = []; User::query() ->whereHas('roles', function ($roles) { $roles->where('roles.name', 'member'); })->where('employee_type', '=', 'full_time') ->active() ->whereNotExists(function ($query) use ($date) { $query->from('timesheet_entries') ->where('timesheet_entries.spent_at', $date) ->whereColumn('timesheet_entries.user_id', 'users.id'); })->each(function ($user) use (&$missingUsersForDate,$date) { if ($date >= $user->start_date) { $missingUsersForDate[] = $user->full_name; } }); if ($missingUsersForDate) { $usersWithoutEntries[$date] = $missingUsersForDate; } } if ($usersWithoutEntries) { $usersWithoutEntriesFormattedAlert = []; foreach ($usersWithoutEntries as $date => $users) { $date = Carbon::parse($date); $usersWithoutEntriesFormattedAlert[] = [ 'message' => sprintf("%s", join(' | ', $users)), 'action' => [ 'code' => 'nav_to_date', 'attr' => [ 'date' => $date->format('Y-m-d'), 'label' => format_date($date, $this->dateFormat), ], ] ]; } $data[] = [ 'message' => sprintf('<b>Users Without Entries</b>'), 'data' => $usersWithoutEntriesFormattedAlert, 'level' => 'info', 'icon' => 'users' ]; } return $data; } public function myMissingEntries($data) { $entriesWithNoFUllTime = Entry::query()->where('timesheet_entries.user_id', '=', user()->id) ->whereIn('timesheet_entries.spent_at', $this->getDatesToBeChecked()) ->select(DB::raw("SUM(hours) as hours,timesheet_entries.*")) ->groupBy('timesheet_entries.spent_at') ->havingRaw("SUM(hours) < 8"); $missingEntries = Entry::query() ->where('timesheet_entries.user_id', '=', user()->id) ->select(DB::raw("hours,timesheet_entries.*")) ->whereIn('timesheet_entries.spent_at', $this->getDatesToBeChecked()); $entries = $entriesWithNoFUllTime->union($missingEntries)->get(); $entriesDates = $entries->pluck('spent_at')->toArray(); $missing_entries_dates = array_map(function ($date) { return Carbon::parse($date); }, array_diff($this->getDatesToBeChecked(), $entriesDates)); if ($missing_entries_dates) { $missing_entries_dates_formatted_alert = []; foreach ($missing_entries_dates as $missing_entry_date) { if ($missing_entry_date >= user()->start_date) { $missing_entries_dates_formatted_alert[] = [ 'message' => '', 'action' => [ 'code' => 'nav_to_date', 'attr' => [ 'date' => $missing_entry_date->format('Y-m-d'), 'label' => format_date($missing_entry_date, $this->dateFormat), ], ] ]; } } $data[] = [ 'message' => '<b>You missed to record your entries for</b>', 'data' => $missing_entries_dates_formatted_alert, 'level' => 'danger', 'icon' => 'exclamation-triangle' ]; } return $data; } }