. */ declare(strict_types=1); namespace FireflyIII\Support\Form; use Amount as Amt; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\TransactionCurrency; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Log; use Throwable; /** * Class CurrencyForm * * All currency related form methods. */ class CurrencyForm { use FormSupport; /** * @param string $name * @param mixed $value * @param array|null $options * * @return string * @throws FireflyException */ public function amount(string $name, $value = null, array $options = null): string { return $this->currencyField($name, 'amount', $value, $options); } /** * @param string $name * @param string $view * @param mixed $value * @param array|null $options * * @return string * @throws FireflyException */ 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'] ?? Amt::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; 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; 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) { 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 string $name * @param mixed $value * @param array|null $options * * @return string * @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 string $name * @param string $view * @param mixed $value * @param array|null $options * * @return string * @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'] ?? Amt::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; 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; 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) { 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 string $name * @param mixed $value * @param array|null $options * * @return string */ 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 string $name * @param mixed $value * @param array|null $options * * @return string */ 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); } }