![]() 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\Models\Entry; use Corals\Modules\Timesheet\Models\Expense; use Corals\Modules\Timesheet\Models\Invoice; use Corals\Modules\Timesheet\Models\Project; use Corals\Modules\Timesheet\Models\Activity; use Corals\Modules\Utility\Models\Category\Category; use Corals\User\Models\User; use Illuminate\Http\Request; class ExpenseService extends BaseServiceClass { public function preStoreUpdate($request, &$additionalData) { if ($request->get('project_id')) { $project = Project::query()->find($request->get('project_id')); $additionalData['client_id'] = $project->client_id; } } public function postStoreUpdate($request, $additionalData = []) { $expense = $this->model; if ($request->get('clear') == 1) { $expense->clearMediaCollection($expense->mediaCollectionName); } if ($request->hasFile('file')) { $expense->clearMediaCollection($expense->mediaCollectionName); $expense->addMedia($request->file('file')) ->withCustomProperties(['root' => 'user_' . user()->hashed_id]) ->toMediaCollection($expense->mediaCollectionName, 'secure_media'); } } public function getUsersPayment($from_date, $to_date) { $users = []; User::query() ->where('status', '=', 'active') ->whereIn('employee_type', ['full_time', 'part_time']) ->whereHas('roles', function ($query) { $query->where('name', 'member'); })->eachById(function ($user) use (&$users, $from_date, $to_date) { $entries = $this->getUserEntries($user->id, $from_date, $to_date); if ($user->employee_type == 'part_time') { if (!$entries->exists()) { return; } $entriesOfWorkingHours = $entries ->selectRaw("round(((SUM(ifNull(timesheet_entries.hours*60,0)) + SUM(ifNull(timesheet_entries.minutes,0)))/60),2) as totalHours") ->first(); $totalHours = $entriesOfWorkingHours['totalHours']; $payment = $totalHours * $user->hourly_rate; $notes = sprintf('%s hours between %s - %s', $totalHours, format_date($from_date), format_date($to_date)); } else { $payment = $user->salary; $notes = sprintf('%s - %s Salary', format_date($from_date), format_date($to_date)); $entriesOfWorkingHours = $entries->clone()->whereHas('activity', function ($query) { $query->where('is_special', 0); })->selectRaw("round(((SUM(ifNull(timesheet_entries.hours*60,0)) + SUM(ifNull(timesheet_entries.minutes,0)))/60),2) as totalHours") ->first(); $workTotalHours = $entriesOfWorkingHours['totalHours']; $period_status = sprintf('%s', $workTotalHours ? "Work hours: " . $workTotalHours : ''); $specialActivitiesEntries = $entries->whereHas('activity', function ($query) { $query->where('is_special', 1); })->selectRaw("round(((SUM(ifNull(timesheet_entries.hours*60,0)) + SUM(ifNull(timesheet_entries.minutes,0)))/60),2) as totalHours , activity_id") ->groupBy('activity_id') ->get(); foreach ($specialActivitiesEntries as $specialActivityEntry) { $activity = Activity::query()->find($specialActivityEntry->activity_id); $period_status .= sprintf('%s ', ", $activity->title: " . $specialActivityEntry->totalHours); } } $users[] = [ 'user_id' => $user->id, 'full_name' => $user->full_name, 'payment' => round($payment, 2), 'notes' => $notes, 'period_status' => $period_status ?? '', 'excluded' => 0, ]; }); return $users; } private function getUserEntries($user_id, $from_date, $to_date) { return Entry::query() ->where('user_id', '=', $user_id) ->where('spent_at', '>=', $from_date) ->where('spent_at', '<=', $to_date); } public function payToUsers(Request $request) { $users = $request->get('users', []); $salariesCategory = Category::query()->where('slug', '=', 'salaries')->first(); $expenses = []; $generationCode = now()->format('YmdHis'); foreach ($users as $user) { if (!floatval($user['payment']) || $user['excluded']) { continue; } $expenses[] = [ 'category_id' => $salariesCategory->id, 'user_id' => $user['user_id'], 'notes' => $user['notes'], 'amount' => $user['payment'], 'expense_date' => $request->get('expense_date'), 'status' => 'paid', 'currency' => $request->get('currency'), 'payment_method' => $request->get('payment_method'), 'properties' => json_encode([ 'generation_code' => $generationCode ]) ]; } Expense::query()->insert($expenses); } /** * @param Expense $expense * @return array|\Illuminate\Http\JsonResponse */ public function generateInvoice(Expense $expense) { $invoice = Invoice::query()->create([ 'code' => Invoice::getCode('INV'), 'project_id' => $expense->project_id, 'client_id' => $expense->client_id, 'subtotal' => $expense->amount, 'tax_total' => 0, 'total' => $expense->amount, 'invoice_date' => $expense->expense_date, 'due_date' => $expense->expense_date, 'status' => 'pending', ]); $invoiceItems[] = [ 'title' => $expense->category->name, 'type' => 'expense', 'rate' => $expense->amount, 'quantity' => 1, 'amount' => $expense->amount, 'notes' => sprintf("Date: %s, %s", format_date($expense->expense_date), $expense->notes), ]; $expense->invoice_id = $invoice->id; $expense->status = 'paid'; $expense->save(); $invoice->items()->createMany($invoiceItems); } }