. */ declare(strict_types=1); namespace FireflyIII\Support\Form; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\TransactionCurrency; use FireflyIII\Repositories\UserGroups\Currency\CurrencyRepositoryInterface; use Illuminate\Support\Collection; /** * Class CurrencyForm * * All currency related form methods. */ class CurrencyForm { use FormSupport; /** * @param mixed $value * * @throws FireflyException */ public function amount(string $name, $value = null, ?array $options = null): string { return $this->currencyField($name, 'amount', $value, $options); } /** * @throws FireflyException * * @phpstan-param view-string $view */ protected function currencyField(string $name, string $view, mixed $value = null, ?array $options = null): string { $label = $this->label($name, $options); $options = $this->expandOptionArray($name, $label, $options); $classes = $this->getHolderClasses($name); $value = $this->fillFieldValue($name, $value); $options['step'] = 'any'; $defaultCurrency = $options['currency'] ?? app('amount')->getDefaultCurrency(); /** @var Collection $currencies */ $currencies = app('amount')->getCurrencies(); unset($options['currency'], $options['placeholder']); // perhaps the currency has been sent to us in the field $amount_currency_id_$name (amount_currency_id_amount) $preFilled = session('preFilled'); if (!is_array($preFilled)) { $preFilled = []; } $key = 'amount_currency_id_'.$name; $sentCurrencyId = array_key_exists($key, $preFilled) ? (int) $preFilled[$key] : $defaultCurrency->id; app('log')->debug(sprintf('Sent currency ID is %d', $sentCurrencyId)); // find this currency in set of currencies: foreach ($currencies as $currency) { if ($currency->id === $sentCurrencyId) { $defaultCurrency = $currency; app('log')->debug(sprintf('default currency is now %s', $defaultCurrency->code)); break; } } // make sure value is formatted nicely: if (null !== $value && '' !== $value) { $value = app('steam')->bcround($value, $defaultCurrency->decimal_places); } try { $html = view('form.'.$view, compact('defaultCurrency', 'currencies', 'classes', 'name', 'label', 'value', 'options'))->render(); } catch (\Throwable $e) { app('log')->debug(sprintf('Could not render currencyField(): %s', $e->getMessage())); $html = 'Could not render currencyField.'; throw new FireflyException($html, 0, $e); } return $html; } /** * TODO describe and cleanup. * * @param mixed $value * * @throws FireflyException */ public function balanceAll(string $name, $value = null, ?array $options = null): string { return $this->allCurrencyField($name, 'balance', $value, $options); } /** * TODO describe and cleanup * * @param mixed $value * * @throws FireflyException */ protected function allCurrencyField(string $name, string $view, $value = null, ?array $options = null): string { $label = $this->label($name, $options); $options = $this->expandOptionArray($name, $label, $options); $classes = $this->getHolderClasses($name); $value = $this->fillFieldValue($name, $value); $options['step'] = 'any'; $defaultCurrency = $options['currency'] ?? app('amount')->getDefaultCurrency(); /** @var Collection $currencies */ $currencies = app('amount')->getAllCurrencies(); unset($options['currency'], $options['placeholder']); // perhaps the currency has been sent to us in the field $amount_currency_id_$name (amount_currency_id_amount) $preFilled = session('preFilled'); if (!is_array($preFilled)) { $preFilled = []; } $key = 'amount_currency_id_'.$name; $sentCurrencyId = array_key_exists($key, $preFilled) ? (int) $preFilled[$key] : $defaultCurrency->id; app('log')->debug(sprintf('Sent currency ID is %d', $sentCurrencyId)); // find this currency in set of currencies: foreach ($currencies as $currency) { if ($currency->id === $sentCurrencyId) { $defaultCurrency = $currency; app('log')->debug(sprintf('default currency is now %s', $defaultCurrency->code)); break; } } // make sure value is formatted nicely: if (null !== $value && '' !== $value) { $value = app('steam')->bcround($value, $defaultCurrency->decimal_places); } try { $html = view('form.'.$view, compact('defaultCurrency', 'currencies', 'classes', 'name', 'label', 'value', 'options'))->render(); } catch (\Throwable $e) { app('log')->debug(sprintf('Could not render currencyField(): %s', $e->getMessage())); $html = 'Could not render currencyField.'; throw new FireflyException($html, 0, $e); } return $html; } /** * TODO cleanup and describe * * @param mixed $value */ public function currencyList(string $name, $value = null, ?array $options = null): string { /** @var CurrencyRepositoryInterface $currencyRepos */ $currencyRepos = app(CurrencyRepositoryInterface::class); // get all currencies: $list = $currencyRepos->get(); $array = []; /** @var TransactionCurrency $currency */ foreach ($list as $currency) { $array[$currency->id] = $currency->name.' ('.$currency->symbol.')'; } return $this->select($name, $array, $value, $options); } /** * TODO cleanup and describe * * @param mixed $value */ public function currencyListEmpty(string $name, $value = null, ?array $options = null): string { /** @var CurrencyRepositoryInterface $currencyRepos */ $currencyRepos = app(CurrencyRepositoryInterface::class); // get all currencies: $list = $currencyRepos->get(); $array = [ 0 => (string) trans('firefly.no_currency'), ]; /** @var TransactionCurrency $currency */ foreach ($list as $currency) { $array[$currency->id] = $currency->name.' ('.$currency->symbol.')'; } return $this->select($name, $array, $value, $options); } }