From 7c9f7f04b7eddce756dcd9c4ac27deb16bd1eaeb Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 1 Aug 2023 10:26:26 +0200 Subject: [PATCH 1/2] Chart field name refactor --- .../Controllers/Chart/AccountController.php | 6 ++-- .../Controllers/Chart/BalanceController.php | 31 +++++++++---------- app/Support/Navigation.php | 19 ------------ app/Support/Request/ConvertsDataTypes.php | 2 +- 4 files changed, 18 insertions(+), 40 deletions(-) diff --git a/app/Api/V2/Controllers/Chart/AccountController.php b/app/Api/V2/Controllers/Chart/AccountController.php index 7075ad16aa..fabb42e6a0 100644 --- a/app/Api/V2/Controllers/Chart/AccountController.php +++ b/app/Api/V2/Controllers/Chart/AccountController.php @@ -123,7 +123,7 @@ class AccountController extends Controller 'start_date' => $start->toAtomString(), 'end_date' => $end->toAtomString(), 'entries' => [], - 'converted_entries' => [], + 'native_entries' => [], ]; $currentStart = clone $start; $range = app('steam')->balanceInRange($account, $start, clone $end, $currency); @@ -140,8 +140,8 @@ class AccountController extends Controller $previousConverted = $balanceConverted; $currentStart->addDay(); - $currentSet['entries'][$label] = $balance; - $currentSet['converted_entries'][$label] = $balanceConverted; + $currentSet['entries'][$label] = $balance; + $currentSet['native_entries'][$label] = $balanceConverted; } $chartData[] = $currentSet; } diff --git a/app/Api/V2/Controllers/Chart/BalanceController.php b/app/Api/V2/Controllers/Chart/BalanceController.php index cbf3fe3281..d9101a147b 100644 --- a/app/Api/V2/Controllers/Chart/BalanceController.php +++ b/app/Api/V2/Controllers/Chart/BalanceController.php @@ -81,8 +81,7 @@ class BalanceController extends Controller $preferredRange = $params['period']; // set some formats, based on input parameters. - $format = app('navigation')->preferredCarbonFormatByPeriod($preferredRange); - $titleFormat = app('navigation')->preferredCarbonLocalizedFormatByPeriod($preferredRange); + $format = app('navigation')->preferredCarbonFormatByPeriod($preferredRange); // prepare for currency conversion and data collection: $ids = $accounts->pluck('id')->toArray(); @@ -144,11 +143,11 @@ class BalanceController extends Controller // set the array (in monetary info) with spent/earned in this $period, if it does not exist. $data[$currencyId][$period] = $data[$currencyId][$period] ?? [ - 'period' => $period, - 'spent' => '0', - 'earned' => '0', - 'converted_spent' => '0', - 'converted_earned' => '0', + 'period' => $period, + 'spent' => '0', + 'earned' => '0', + 'native_spent' => '0', + 'native_earned' => '0', ]; // is this journal's amount in- our outgoing? $key = 'spent'; @@ -179,7 +178,7 @@ class BalanceController extends Controller $data[$currencyId][$period][$key] = bcadd($data[$currencyId][$period][$key], $amount); // add converted entry - $convertedKey = sprintf('converted_%s', $key); + $convertedKey = sprintf('native_%s', $key); $data[$currencyId][$period][$convertedKey] = bcadd($data[$currencyId][$period][$convertedKey], $amountConverted); } @@ -198,7 +197,7 @@ class BalanceController extends Controller 'native_code' => $currency['native_code'], 'native_decimal_places' => $currency['native_decimal_places'], 'entries' => [], - 'converted_entries' => [], + 'native_entries' => [], ]; $expense = [ 'label' => sprintf('spent-%s', $currency['currency_code']), @@ -211,21 +210,21 @@ class BalanceController extends Controller 'native_code' => $currency['native_code'], 'native_decimal_places' => $currency['native_decimal_places'], 'entries' => [], - 'converted_entries' => [], + 'native_entries' => [], ]; // loop all possible periods between $start and $end, and add them to the correct dataset. $currentStart = clone $start; while ($currentStart <= $end) { $key = $currentStart->format($format); - $title = $currentStart->isoFormat($titleFormat); + $label = $currentStart->toAtomString(); // normal entries - $income['entries'][$title] = app('steam')->bcround(($currency[$key]['earned'] ?? '0'), $currency['currency_decimal_places']); - $expense['entries'][$title] = app('steam')->bcround(($currency[$key]['spent'] ?? '0'), $currency['currency_decimal_places']); + $income['entries'][$label] = app('steam')->bcround(($currency[$key]['earned'] ?? '0'), $currency['currency_decimal_places']); + $expense['entries'][$label] = app('steam')->bcround(($currency[$key]['spent'] ?? '0'), $currency['currency_decimal_places']); // converted entries - $income['converted_entries'][$title] = app('steam')->bcround(($currency[$key]['converted_earned'] ?? '0'), $currency['native_decimal_places']); - $expense['converted_entries'][$title] = app('steam')->bcround(($currency[$key]['converted_spent'] ?? '0'), $currency['native_decimal_places']); + $income['converted_entries'][$label] = app('steam')->bcround(($currency[$key]['converted_earned'] ?? '0'), $currency['native_decimal_places']); + $expense['converted_entries'][$label] = app('steam')->bcround(($currency[$key]['converted_spent'] ?? '0'), $currency['native_decimal_places']); // next loop $currentStart = app('navigation')->addPeriod($currentStart, $preferredRange, 0); @@ -234,8 +233,6 @@ class BalanceController extends Controller $chartData[] = $income; $chartData[] = $expense; } - //$data = $this->generator->multiSet($chartData); - return response()->json($chartData); } diff --git a/app/Support/Navigation.php b/app/Support/Navigation.php index 27b1ec2fde..a9349579a5 100644 --- a/app/Support/Navigation.php +++ b/app/Support/Navigation.php @@ -559,25 +559,6 @@ class Navigation return $format; } - /** - * Same as preferredCarbonLocalizedFormat but based on the period. - * - * @param string $period - * - * @return string - */ - public function preferredCarbonLocalizedFormatByPeriod(string $period): string - { - $locale = app('steam')->getLocale(); - return match ($period) { - default => (string)trans('config.month_and_day_js', [], $locale), - '1W' => (string)trans('config.week_in_year_js', [], $locale), - '1M' => (string)trans('config.month_js', [], $locale), - '3M', '6M' => (string)trans('config.half_year_js', [], $locale), - '1Y' => (string)trans('config.year_js', [], $locale), - }; - } - /** * If the date difference between start and end is less than a month, method returns "endOfDay". If the difference * is less than a year, method returns "endOfMonth". If the date difference is larger, method returns "endOfYear". diff --git a/app/Support/Request/ConvertsDataTypes.php b/app/Support/Request/ConvertsDataTypes.php index 88f1979819..b549f2e545 100644 --- a/app/Support/Request/ConvertsDataTypes.php +++ b/app/Support/Request/ConvertsDataTypes.php @@ -376,7 +376,7 @@ trait ConvertsDataTypes { $result = null; try { - $result = $this->get($field) ? new Carbon($this->get($field)) : null; + $result = $this->get($field) ? new Carbon($this->get($field), config('app.timezone')) : null; } catch (InvalidFormatException $e) { // @ignoreException } From bfc5c5d1544de767d4c7f7e3761126280bddf487 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 1 Aug 2023 11:15:19 +0200 Subject: [PATCH 2/2] Fix API version and match API --- .../Controllers/Chart/AccountController.php | 12 ++-- .../Controllers/Chart/BalanceController.php | 13 +++- app/Support/Http/Api/CleansChartData.php | 69 +++++++++++++++++++ .../Http/Api/ConvertsExchangeRates.php | 2 + config/firefly.php | 4 +- 5 files changed, 90 insertions(+), 10 deletions(-) create mode 100644 app/Support/Http/Api/CleansChartData.php diff --git a/app/Api/V2/Controllers/Chart/AccountController.php b/app/Api/V2/Controllers/Chart/AccountController.php index fabb42e6a0..868a446ecd 100644 --- a/app/Api/V2/Controllers/Chart/AccountController.php +++ b/app/Api/V2/Controllers/Chart/AccountController.php @@ -31,7 +31,7 @@ use FireflyIII\Models\Account; use FireflyIII\Models\AccountType; use FireflyIII\Models\TransactionCurrency; use FireflyIII\Repositories\Administration\Account\AccountRepositoryInterface; -use FireflyIII\Support\Http\Api\ConvertsExchangeRates; +use FireflyIII\Support\Http\Api\CleansChartData; use FireflyIII\User; use Illuminate\Http\JsonResponse; use Psr\Container\ContainerExceptionInterface; @@ -42,7 +42,7 @@ use Psr\Container\NotFoundExceptionInterface; */ class AccountController extends Controller { - use ConvertsExchangeRates; + use CleansChartData; private AccountRepositoryInterface $repository; @@ -81,6 +81,7 @@ class AccountController extends Controller $start = $dates['start']; /** @var Carbon $end */ $end = $dates['end']; + $end->endOfDay(); /** @var User $user */ $user = auth()->user(); @@ -120,8 +121,9 @@ class AccountController extends Controller 'native_code' => $default->code, 'native_symbol' => $default->symbol, 'native_decimal_places' => (int)$default->decimal_places, - 'start_date' => $start->toAtomString(), - 'end_date' => $end->toAtomString(), + 'start' => $start->toAtomString(), + 'end' => $end->toAtomString(), + 'period' => '1D', 'entries' => [], 'native_entries' => [], ]; @@ -146,6 +148,6 @@ class AccountController extends Controller $chartData[] = $currentSet; } - return response()->json($chartData); + return response()->json($this->clean($chartData)); } } diff --git a/app/Api/V2/Controllers/Chart/BalanceController.php b/app/Api/V2/Controllers/Chart/BalanceController.php index d9101a147b..0a6a4cd4c0 100644 --- a/app/Api/V2/Controllers/Chart/BalanceController.php +++ b/app/Api/V2/Controllers/Chart/BalanceController.php @@ -28,7 +28,7 @@ use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Administration\Account\AccountRepositoryInterface; -use FireflyIII\Support\Http\Api\ConvertsExchangeRates; +use FireflyIII\Support\Http\Api\CleansChartData; use FireflyIII\Support\Http\Api\ExchangeRateConverter; use Illuminate\Http\JsonResponse; use Illuminate\Support\Collection; @@ -38,7 +38,7 @@ use Illuminate\Support\Collection; */ class BalanceController extends Controller { - use ConvertsExchangeRates; + use CleansChartData; private AccountRepositoryInterface $repository; @@ -76,6 +76,7 @@ class BalanceController extends Controller $start = $params['start']; /** @var Carbon $end */ $end = $params['end']; + $end->endOfDay(); /** @var Collection $accounts */ $accounts = $params['accounts']; $preferredRange = $params['period']; @@ -196,6 +197,9 @@ class BalanceController extends Controller 'native_symbol' => $currency['native_symbol'], 'native_code' => $currency['native_code'], 'native_decimal_places' => $currency['native_decimal_places'], + 'start' => $start->toAtomString(), + 'end' => $end->toAtomString(), + 'period' => $preferredRange, 'entries' => [], 'native_entries' => [], ]; @@ -209,6 +213,9 @@ class BalanceController extends Controller 'native_symbol' => $currency['native_symbol'], 'native_code' => $currency['native_code'], 'native_decimal_places' => $currency['native_decimal_places'], + 'start' => $start->toAtomString(), + 'end' => $end->toAtomString(), + 'period' => $preferredRange, 'entries' => [], 'native_entries' => [], @@ -233,7 +240,7 @@ class BalanceController extends Controller $chartData[] = $income; $chartData[] = $expense; } - return response()->json($chartData); + return response()->json($this->clean($chartData)); } } diff --git a/app/Support/Http/Api/CleansChartData.php b/app/Support/Http/Api/CleansChartData.php new file mode 100644 index 0000000000..3d969a5ad9 --- /dev/null +++ b/app/Support/Http/Api/CleansChartData.php @@ -0,0 +1,69 @@ +. + */ + +namespace FireflyIII\Support\Http\Api; + +use FireflyIII\Exceptions\FireflyException; + +/** + * Trait CleansChartData + */ +trait CleansChartData +{ + /** + * Clean up given chart data array. Each entry is supposed to be a + * "main" entry used in the V2 API chart endpoints. This loop makes sure + * IDs are strings and other values are present (or missing). + * + * @param array $data + * + * @return array + * @throws FireflyException + */ + private function clean(array $data): array + { + $return = []; + /** + * @var mixed $index + * @var array $array + */ + foreach ($data as $index => $array) { + if (array_key_exists('currency_id', $array)) { + $array['currency_id'] = (string)$array['currency_id']; + } + if (array_key_exists('native_id', $array)) { + $array['native_id'] = (string)$array['native_id']; + } + if (!array_key_exists('end', $array)) { + throw new FireflyException(sprintf('Data-set "%s" is missing the "end"-variable.', $index)); + } + if (!array_key_exists('start', $array)) { + throw new FireflyException(sprintf('Data-set "%s" is missing the "start"-variable.', $index)); + } + if (!array_key_exists('period', $array)) { + throw new FireflyException(sprintf('Data-set "%s" is missing the "period"-variable.', $index)); + } + $return[] = $array; + } + return $return; + } + +} diff --git a/app/Support/Http/Api/ConvertsExchangeRates.php b/app/Support/Http/Api/ConvertsExchangeRates.php index c2d828903d..7c80220e46 100644 --- a/app/Support/Http/Api/ConvertsExchangeRates.php +++ b/app/Support/Http/Api/ConvertsExchangeRates.php @@ -230,9 +230,11 @@ trait ConvertsExchangeRates * @param array $entries * * @return array + * @deprecated */ public function cerSum(array $entries): array { + die('do not use me, needs refactor'); if (null === $this->enabled) { $this->getPreference(); } diff --git a/config/firefly.php b/config/firefly.php index 240ba477b8..b800bbc188 100644 --- a/config/firefly.php +++ b/config/firefly.php @@ -108,8 +108,8 @@ return [ 'handle_debts' => true, // see cer.php for exchange rates feature flag. ], - 'version' => '6.0.19', - 'api_version' => '2.0.4', + 'version' => '6.0.20', + 'api_version' => '2.0.5', 'db_version' => 19, // generic settings