Spamworldpro Mini Shell
Spamworldpro


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/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/corals/ts.corals.io/corals-api/Corals/modules/Timesheet/Hooks/Timesheet.php
<?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;
    }
}

Spamworldpro Mini