| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 | <?php
namespace App\Utilities\Currency;
use Akaunting\Money\Currency as CurrencyBase;
use App\Models\Setting\Currency as CurrencyModel;
use Illuminate\Database\Eloquent\Collection;
use Symfony\Component\Intl\Currencies;
use Symfony\Component\Intl\Exception\MissingResourceException;
class ConfigureCurrencies
{
    public static function syncCurrencies(): void
    {
        $currencies = static::fetchCurrencies();
        if ($currencies->isEmpty()) {
            return;
        }
        $customCurrencies = static::formatCurrencies($currencies);
        static::mergeAndSetCurrencies($customCurrencies);
        $defaultCurrency = CurrencyAccessor::getDefaultCurrency();
        if ($defaultCurrency) {
            config(['money.defaults.currency' => $defaultCurrency]);
        }
    }
    protected static function fetchCurrencies(): Collection
    {
        return CurrencyModel::all();
    }
    protected static function formatCurrencies(Collection $currencies): array
    {
        $customCurrencies = [];
        foreach ($currencies as $currency) {
            /** @var CurrencyModel $currency */
            $customCurrencies[$currency->code] = [
                'name' => $currency->name,
                'rate' => $currency->rate,
                'precision' => $currency->precision,
                'symbol' => $currency->symbol,
                'symbol_first' => $currency->symbol_first,
                'decimal_mark' => $currency->decimal_mark,
                'thousands_separator' => $currency->thousands_separator,
            ];
        }
        return $customCurrencies;
    }
    protected static function mergeAndSetCurrencies(array $customCurrencies): void
    {
        $existingCurrencies = CurrencyBase::getCurrencies();
        foreach ($existingCurrencies as $code => $currency) {
            try {
                $name = Currencies::getName($code, app()->getLocale());
                $existingCurrencies[$code]['name'] = ucwords($name);
            } catch (MissingResourceException) {
                $existingCurrencies[$code]['name'] = $currency['name'];
            }
        }
        $mergedCurrencies = array_replace_recursive($existingCurrencies, $customCurrencies);
        CurrencyBase::setCurrencies($mergedCurrencies);
    }
}
 |