Files
firefly-iii/app/Support/Form/CurrencyForm.php

220 lines
7.5 KiB
PHP
Raw Normal View History

<?php
/**
* CurrencyForm.php
2020-02-16 13:56:52 +01:00
* Copyright (c) 2019 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
2019-08-17 12:09:03 +02:00
declare(strict_types=1);
namespace FireflyIII\Support\Form;
2021-04-06 17:00:16 +02:00
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\TransactionCurrency;
2023-10-28 06:58:33 +02:00
use FireflyIII\Repositories\UserGroups\Currency\CurrencyRepositoryInterface;
use Illuminate\Support\Collection;
/**
* Class CurrencyForm
*
* All currency related form methods.
*/
class CurrencyForm
{
use FormSupport;
2019-08-10 16:50:37 +02:00
/**
2023-12-20 19:35:52 +01:00
* @param mixed $value
*
2023-02-22 18:03:31 +01:00
* @throws FireflyException
*/
public function amount(string $name, $value = null, ?array $options = null): string
{
2021-03-21 09:15:40 +01:00
return $this->currencyField($name, 'amount', $value, $options);
}
2023-12-20 19:35:52 +01:00
/**
2023-02-22 18:03:31 +01:00
* @throws FireflyException
2025-01-05 07:31:26 +01:00
*
2025-01-04 19:25:43 +01:00
* @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';
2023-10-29 17:41:14 +01:00
$defaultCurrency = $options['currency'] ?? app('amount')->getDefaultCurrency();
2023-12-20 19:35:52 +01:00
/** @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');
2021-04-09 09:02:00 +02:00
if (!is_array($preFilled)) {
$preFilled = [];
}
$key = 'amount_currency_id_'.$name;
$sentCurrencyId = array_key_exists($key, $preFilled) ? (int) $preFilled[$key] : $defaultCurrency->id;
2023-10-29 06:33:43 +01:00
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;
2023-10-29 06:33:43 +01:00
app('log')->debug(sprintf('default currency is now %s', $defaultCurrency->code));
2023-12-20 19:35:52 +01:00
break;
}
}
// make sure value is formatted nicely:
if (null !== $value && '' !== $value) {
2022-12-24 05:06:39 +01:00
$value = app('steam')->bcround($value, $defaultCurrency->decimal_places);
}
2023-12-20 19:35:52 +01:00
try {
$html = view('form.'.$view, compact('defaultCurrency', 'currencies', 'classes', 'name', 'label', 'value', 'options'))->render();
} catch (\Throwable $e) {
2023-10-29 06:33:43 +01:00
app('log')->debug(sprintf('Could not render currencyField(): %s', $e->getMessage()));
$html = 'Could not render currencyField.';
2023-12-20 19:35:52 +01:00
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);
}
2023-06-21 12:34:58 +02:00
/**
* TODO describe and cleanup
*
2023-12-20 19:35:52 +01:00
* @param mixed $value
2023-06-21 12:34:58 +02:00
*
* @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';
2023-10-29 17:41:14 +01:00
$defaultCurrency = $options['currency'] ?? app('amount')->getDefaultCurrency();
2023-12-20 19:35:52 +01:00
/** @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');
2021-04-09 09:02:00 +02:00
if (!is_array($preFilled)) {
$preFilled = [];
}
$key = 'amount_currency_id_'.$name;
$sentCurrencyId = array_key_exists($key, $preFilled) ? (int) $preFilled[$key] : $defaultCurrency->id;
2023-10-29 06:33:43 +01:00
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;
2023-10-29 06:33:43 +01:00
app('log')->debug(sprintf('default currency is now %s', $defaultCurrency->code));
2023-12-20 19:35:52 +01:00
break;
}
}
// make sure value is formatted nicely:
if (null !== $value && '' !== $value) {
2022-12-24 05:06:39 +01:00
$value = app('steam')->bcround($value, $defaultCurrency->decimal_places);
}
2023-12-20 19:35:52 +01:00
try {
$html = view('form.'.$view, compact('defaultCurrency', 'currencies', 'classes', 'name', 'label', 'value', 'options'))->render();
} catch (\Throwable $e) {
2023-10-29 06:33:43 +01:00
app('log')->debug(sprintf('Could not render currencyField(): %s', $e->getMessage()));
$html = 'Could not render currencyField.';
2023-12-20 19:35:52 +01:00
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 = [
2024-12-22 08:43:12 +01:00
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);
}
2019-08-17 12:09:03 +02:00
}