HEX
Server: nginx/1.18.0
System: Linux test-ipsremont 5.4.0-214-generic #234-Ubuntu SMP Fri Mar 14 23:50:27 UTC 2025 x86_64
User: ips (1000)
PHP: 8.0.30
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/ipsremont-demo/app/Repository/Currency/CurrencyRepository.php
<?php

namespace App\Repository\Currency;

use App\Http\Requests\Currency\CreateRequest;
use App\Http\Requests\Currency\IndexRequest;
use App\Models\Currency;
use App\Models\CurrencyRateHistory;
use App\Repository\BaseRepository;
use App\Traits\GridTrait;
use Illuminate\Database\Eloquent\Builder;

class CurrencyRepository extends BaseRepository
{

    use GridTrait;

    public static function getQuery(): Builder
    {
        return Currency::query();
    }

    public function search(IndexRequest $request)
    {
        $query = self::getAvailable();

        $this->makeQueryOrdered(Currency::class, $query, $request);

        if (isset($request->name) && !empty($request->name)) {
            $query->where('name', 'like', '%' . $request->name . '%');
        }

        if (isset($request->code) && !empty($request->code)) {
            $query->where('code', 'like', '%' . $request->code . '%');
        }

        $perPage = $request->per_page ?? config('crud.defaultPerPage');

        return $query->paginate((int) $perPage)->appends($request->all());
    }

    public function save(CreateRequest $request): Currency
    {
        $model = new Currency();

        $request->validate($request->rules());

        $fields = $request->all();

        $model->fill($fields)->save();

        return $model;
    }

    public function delete($id): void
    {
        self::getById($id)->delete();
    }

    public static function getById($id)
    {
        return static::getAvailable()->find($id);
    }

    public static function getAll()
    {
        return Currency::all();
    }

    public static function getByCode($code)
    {
        return static::getAvailable()->where('code', $code)->first();
    }

    public function addToHistory(int $currencyId, float $rate): void
    {
        /** @var ?CurrencyRateHistory $lastRate */
        $lastRate = CurrencyRateHistory::getQuery()->where('currency_id', $currencyId)->latest()->first();
        if (isset($lastRate) && $lastRate->rate === round($rate, 5)) {
            return;
        }

        $rateHistory = new CurrencyRateHistory();
        $rateHistory->currency_id = $currencyId;
        $rateHistory->rate = $rate;
        $rateHistory->created_at = date('Y-m-d H:i:s');
        $rateHistory->save();
    }

}