![]() 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/ |
<?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); } }