HEX
Server: nginx/1.28.1
System: Linux 10-41-63-61 6.8.0-31-generic #31-Ubuntu SMP PREEMPT_DYNAMIC Sat Apr 20 00:40:06 UTC 2024 x86_64
User: www (1001)
PHP: 7.4.33
Disabled: passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,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_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
Upload Files
File: /www/wwwroot/www.ankua.asia/beike/Services/CurrencyService.php
<?php
/**
 * CurrencyService.php
 *
 * @copyright  2022 beikeshop.com - All Rights Reserved
 * @link       https://beikeshop.com
 * @author     TL <mengwb@guangda.work>
 * @created    2022-07-28 16:29:54
 * @modified   2022-07-28 16:29:54
 */

namespace Beike\Services;

use Beike\Repositories\CurrencyRepo;
use Illuminate\Support\Facades\Http;

class CurrencyService
{
    private static $instance;

    private $currencies = [];

    public function __construct()
    {
        foreach (CurrencyRepo::listEnabled() as $result) {
            $this->currencies[$result->code] = $result;
        }
    }

    public static function getInstance()
    {
        if (! self::$instance) {
            self::$instance = new self();
        }

        return self::$instance;
    }

    public function format($amount, $currency, $value = '', $format = true)
    {
        if (empty($this->currencies)) {
            return $amount;
        }

        $currencyRow = $this->currencies[$currency] ?? null;
        if (empty($currencyRow)) {
            return $amount;
        }

        $symbol_left   = $currencyRow->symbol_left;
        $symbol_right  = $currencyRow->symbol_right;
        $decimal_place = $currencyRow->decimal_place;

        if (! $value) {
            $value = $currencyRow->value;
        }

        $amount = $value ? (float) $amount * $value : (float) $amount;

        $amount = round($amount, (int) $decimal_place);

        if (! $format) {
            return $amount;
        }

        $string = '';
        if ($amount < 0) {
            $string = '-';
        }

        if ($symbol_left) {
            $string .= $symbol_left;
        }

        $string .= number_format(abs($amount), (int) $decimal_place, __('currency.decimal_point'), __('currency.thousand_point'));

        if ($symbol_right) {
            $string .= ' ' . $symbol_right;
        }

        return $string;
    }

    public function convert($value, $from, $to)
    {
        if (isset($this->currencies[$from])) {
            $from = $this->currencies[$from]->value;
        } else {
            $from = 1;
        }

        if (isset($this->currencies[$to])) {
            $to = $this->currencies[$to]->value;
        } else {
            $to = 1;
        }

        return $value * ($to / $from);
    }

    public function getRatesFromApi(string $date)
    {
        $cacheKey = 'currency:rates:' . $date;
        if ($rates = cache()->get($cacheKey)) {
            return $rates;
        }
        if (empty(system_setting('base.rate_api_key'))) {
            return [];
        }
        $data = Http::get(
            sprintf(
                'https://v6.exchangerate-api.com/v6/%s/latest/%s',
                system_setting('base.rate_api_key'),
                system_setting('base.currency', 'USD')
            )
        )->json();
        $rates = $data['conversion_rates'] ?? [];
        cache()->set($cacheKey, $rates);

        return $rates;
    }
}