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/ExpenseService.php
<?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);
    }
}

Spamworldpro Mini