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/Classes/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

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

Spamworldpro Mini