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

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

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

Spamworldpro Mini