mirror of
				https://github.com/firefly-iii/firefly-iii.git
				synced 2025-10-31 02:36:28 +00:00 
			
		
		
		
	Auto commit for release 'branch-v6.2' on 2024-12-26
This commit is contained in:
		| @@ -50,7 +50,7 @@ abstract class Controller extends BaseController | ||||
|     use DispatchesJobs; | ||||
|     use ValidatesRequests; | ||||
| 
 | ||||
|     protected const string CONTENT_TYPE = 'application/vnd.api+json'; | ||||
|     protected const string CONTENT_TYPE    = 'application/vnd.api+json'; | ||||
| 
 | ||||
|     /** @var array<int, string> */ | ||||
|     protected array        $allowedSort; | ||||
| @@ -68,7 +68,7 @@ abstract class Controller extends BaseController | ||||
|             function ($request, $next) { | ||||
|                 $this->parameters = $this->getParameters(); | ||||
|                 if (auth()->check()) { | ||||
|                     $language = app('steam')->getLanguage(); | ||||
|                     $language              = app('steam')->getLanguage(); | ||||
|                     $this->convertToNative = app('preferences')->get('convert_to_native', false)->data; | ||||
|                     app()->setLocale($language); | ||||
| 
 | ||||
|   | ||||
| @@ -54,8 +54,8 @@ class Controller extends BaseController | ||||
| { | ||||
|     use ValidatesUserGroupTrait; | ||||
| 
 | ||||
|     protected const string CONTENT_TYPE = 'application/vnd.api+json'; | ||||
|     protected array        $acceptedRoles = [UserRoleEnum::READ_ONLY]; | ||||
|     protected const string CONTENT_TYPE     = 'application/vnd.api+json'; | ||||
|     protected array        $acceptedRoles   = [UserRoleEnum::READ_ONLY]; | ||||
|     protected ParameterBag $parameters; | ||||
|     protected bool         $convertToNative = false; | ||||
| 
 | ||||
| @@ -78,12 +78,12 @@ class Controller extends BaseController | ||||
|      */ | ||||
|     private function getParameters(): ParameterBag | ||||
|     { | ||||
|         $bag = new ParameterBag(); | ||||
|         $bag      = new ParameterBag(); | ||||
|         $bag->set('limit', 50); | ||||
| 
 | ||||
|         try { | ||||
|             $page = (int) request()->get('page'); | ||||
|         } catch (ContainerExceptionInterface | NotFoundExceptionInterface $e) { | ||||
|         } catch (ContainerExceptionInterface|NotFoundExceptionInterface $e) { | ||||
|             $page = 1; | ||||
|         } | ||||
| 
 | ||||
| @@ -113,7 +113,7 @@ class Controller extends BaseController | ||||
|             if (null !== $date) { | ||||
|                 try { | ||||
|                     $obj = Carbon::parse((string) $date, config('app.timezone')); | ||||
|                 } catch (InvalidDateException | InvalidFormatException $e) { | ||||
|                 } catch (InvalidDateException|InvalidFormatException $e) { | ||||
|                     // don't care
 | ||||
|                     app('log')->warning(sprintf('Ignored invalid date "%s" in API v2 controller parameter check: %s', substr((string) $date, 0, 20), $e->getMessage())); | ||||
|                 } | ||||
| @@ -156,18 +156,18 @@ class Controller extends BaseController | ||||
| 
 | ||||
|     final protected function jsonApiList(string $key, LengthAwarePaginator $paginator, AbstractTransformer $transformer): array | ||||
|     { | ||||
|         $manager = new Manager(); | ||||
|         $baseUrl = request()->getSchemeAndHttpHost() . '/api/v2'; | ||||
|         $manager  = new Manager(); | ||||
|         $baseUrl  = request()->getSchemeAndHttpHost().'/api/v2'; | ||||
| 
 | ||||
|         // TODO add stuff to path?
 | ||||
| 
 | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
| 
 | ||||
|         $objects = $paginator->getCollection(); | ||||
|         $objects  = $paginator->getCollection(); | ||||
| 
 | ||||
|         // the transformer, at this point, needs to collect information that ALL items in the collection
 | ||||
|         // require, like meta-data and stuff like that, and save it for later.
 | ||||
|         $objects = $transformer->collectMetaData($objects); | ||||
|         $objects  = $transformer->collectMetaData($objects); | ||||
|         $paginator->setCollection($objects); | ||||
| 
 | ||||
|         $resource = new FractalCollection($objects, $transformer, $key); | ||||
| @@ -181,11 +181,11 @@ class Controller extends BaseController | ||||
|      * | ||||
|      * @param array<int, mixed>|Model $object | ||||
|      */ | ||||
|     final protected function jsonApiObject(string $key, array | Model $object, AbstractTransformer $transformer): array | ||||
|     final protected function jsonApiObject(string $key, array|Model $object, AbstractTransformer $transformer): array | ||||
|     { | ||||
|         // create some objects:
 | ||||
|         $manager = new Manager(); | ||||
|         $baseUrl = request()->getSchemeAndHttpHost() . '/api/v2'; | ||||
|         $manager  = new Manager(); | ||||
|         $baseUrl  = request()->getSchemeAndHttpHost().'/api/v2'; | ||||
|         $manager->setSerializer(new JsonApiSerializer($baseUrl)); | ||||
| 
 | ||||
|         $transformer->collectMetaData(new Collection([$object])); | ||||
|   | ||||
| @@ -27,14 +27,12 @@ use Carbon\Carbon; | ||||
| use FireflyIII\Exceptions\FireflyException; | ||||
| use FireflyIII\Http\Controllers\Controller; | ||||
| use FireflyIII\Models\Account; | ||||
| use FireflyIII\Models\TransactionCurrency; | ||||
| use FireflyIII\Repositories\Account\AccountRepositoryInterface; | ||||
| use FireflyIII\Support\Facades\Steam; | ||||
| use FireflyIII\Support\Http\Controllers\BasicDataSupport; | ||||
| use Illuminate\Contracts\View\Factory; | ||||
| use Illuminate\Http\Request; | ||||
| use Illuminate\Pagination\LengthAwarePaginator; | ||||
| use Illuminate\Support\Facades\Log; | ||||
| use Illuminate\View\View; | ||||
| 
 | ||||
| /** | ||||
| @@ -73,22 +71,22 @@ class IndexController extends Controller | ||||
|      *                                              */ | ||||
|     public function inactive(Request $request, string $objectType) | ||||
|     { | ||||
|         $inactivePage = true; | ||||
|         $subTitle     = (string) trans(sprintf('firefly.%s_accounts_inactive', $objectType)); | ||||
|         $subTitleIcon = config(sprintf('firefly.subIconsByIdentifier.%s', $objectType)); | ||||
|         $types        = config(sprintf('firefly.accountTypesByIdentifier.%s', $objectType)); | ||||
|         $collection   = $this->repository->getInactiveAccountsByType($types); | ||||
|         $total        = $collection->count(); | ||||
|         $page         = 0 === (int) $request->get('page') ? 1 : (int) $request->get('page'); | ||||
|         $pageSize     = (int) app('preferences')->get('listPageSize', 50)->data; | ||||
|         $accounts     = $collection->slice(($page - 1) * $pageSize, $pageSize); | ||||
|         $inactivePage  = true; | ||||
|         $subTitle      = (string) trans(sprintf('firefly.%s_accounts_inactive', $objectType)); | ||||
|         $subTitleIcon  = config(sprintf('firefly.subIconsByIdentifier.%s', $objectType)); | ||||
|         $types         = config(sprintf('firefly.accountTypesByIdentifier.%s', $objectType)); | ||||
|         $collection    = $this->repository->getInactiveAccountsByType($types); | ||||
|         $total         = $collection->count(); | ||||
|         $page          = 0 === (int) $request->get('page') ? 1 : (int) $request->get('page'); | ||||
|         $pageSize      = (int) app('preferences')->get('listPageSize', 50)->data; | ||||
|         $accounts      = $collection->slice(($page - 1) * $pageSize, $pageSize); | ||||
|         unset($collection); | ||||
| 
 | ||||
|         /** @var Carbon $start */ | ||||
|         $start = clone session('start', today(config('app.timezone'))->startOfMonth()); | ||||
|         $start         = clone session('start', today(config('app.timezone'))->startOfMonth()); | ||||
| 
 | ||||
|         /** @var Carbon $end */ | ||||
|         $end = clone session('end', today(config('app.timezone'))->endOfMonth()); | ||||
|         $end           = clone session('end', today(config('app.timezone'))->endOfMonth()); | ||||
|         $start->subDay(); | ||||
| 
 | ||||
|         $ids           = $accounts->pluck('id')->toArray(); | ||||
| @@ -113,7 +111,7 @@ class IndexController extends Controller | ||||
|         ); | ||||
| 
 | ||||
|         // make paginator:
 | ||||
|         $accounts = new LengthAwarePaginator($accounts, $total, $pageSize, $page); | ||||
|         $accounts      = new LengthAwarePaginator($accounts, $total, $pageSize, $page); | ||||
|         $accounts->setPath(route('accounts.inactive.index', [$objectType])); | ||||
| 
 | ||||
|         return view('accounts.index', compact('objectType', 'inactivePage', 'subTitleIcon', 'subTitle', 'page', 'accounts')); | ||||
| @@ -129,9 +127,9 @@ class IndexController extends Controller | ||||
|     public function index(Request $request, string $objectType) | ||||
|     { | ||||
|         app('log')->debug(sprintf('Now at %s', __METHOD__)); | ||||
|         $subTitle     = (string) trans(sprintf('firefly.%s_accounts', $objectType)); | ||||
|         $subTitleIcon = config(sprintf('firefly.subIconsByIdentifier.%s', $objectType)); | ||||
|         $types        = config(sprintf('firefly.accountTypesByIdentifier.%s', $objectType)); | ||||
|         $subTitle      = (string) trans(sprintf('firefly.%s_accounts', $objectType)); | ||||
|         $subTitleIcon  = config(sprintf('firefly.subIconsByIdentifier.%s', $objectType)); | ||||
|         $types         = config(sprintf('firefly.accountTypesByIdentifier.%s', $objectType)); | ||||
| 
 | ||||
|         $this->repository->resetAccountOrder(); | ||||
| 
 | ||||
| @@ -147,10 +145,10 @@ class IndexController extends Controller | ||||
|         unset($collection); | ||||
| 
 | ||||
|         /** @var Carbon $start */ | ||||
|         $start = clone session('start', today(config('app.timezone'))->startOfMonth()); | ||||
|         $start         = clone session('start', today(config('app.timezone'))->startOfMonth()); | ||||
| 
 | ||||
|         /** @var Carbon $end */ | ||||
|         $end = clone session('end', today(config('app.timezone'))->endOfMonth()); | ||||
|         $end           = clone session('end', today(config('app.timezone'))->endOfMonth()); | ||||
|         $start->subDay(); | ||||
| 
 | ||||
|         $ids           = $accounts->pluck('id')->toArray(); | ||||
| @@ -161,12 +159,12 @@ class IndexController extends Controller | ||||
| 
 | ||||
|         $accounts->each( | ||||
|             function (Account $account) use ($activities, $startBalances, $endBalances): void { | ||||
|                 $interest = (string) $this->repository->getMetaValue($account, 'interest'); | ||||
|                 $interest = '' === $interest ? '0' : $interest; | ||||
|                 $currency = $this->repository->getAccountCurrency($account); | ||||
|                 $interest                     = (string) $this->repository->getMetaValue($account, 'interest'); | ||||
|                 $interest                     = '' === $interest ? '0' : $interest; | ||||
|                 $currency                     = $this->repository->getAccountCurrency($account); | ||||
| 
 | ||||
|                 $account->startBalances     = Steam::filterAccountBalance($startBalances[$account->id] ?? [], $account, $this->convertToNative, $currency); | ||||
|                 $account->endBalances       = Steam::filterAccountBalance($endBalances[$account->id] ?? [], $account, $this->convertToNative, $currency); | ||||
|                 $account->startBalances       = Steam::filterAccountBalance($startBalances[$account->id] ?? [], $account, $this->convertToNative, $currency); | ||||
|                 $account->endBalances         = Steam::filterAccountBalance($endBalances[$account->id] ?? [], $account, $this->convertToNative, $currency); | ||||
|                 $account->differences         = $this->subtract($account->startBalances, $account->endBalances); | ||||
|                 $account->lastActivityDate    = $this->isInArrayDate($activities, $account->id); | ||||
|                 $account->interest            = app('steam')->bcround($interest, 4); | ||||
| @@ -187,7 +185,7 @@ class IndexController extends Controller | ||||
|         app('log')->debug(sprintf('Count of accounts before LAP: %d', $accounts->count())); | ||||
| 
 | ||||
|         /** @var LengthAwarePaginator $accounts */ | ||||
|         $accounts = new LengthAwarePaginator($accounts, $total, $pageSize, $page); | ||||
|         $accounts      = new LengthAwarePaginator($accounts, $total, $pageSize, $page); | ||||
|         $accounts->setPath(route('accounts.index', [$objectType])); | ||||
| 
 | ||||
|         app('log')->debug(sprintf('Count of accounts after LAP (1): %d', $accounts->count())); | ||||
| @@ -196,7 +194,6 @@ class IndexController extends Controller | ||||
|         return view('accounts.index', compact('objectType', 'inactiveCount', 'subTitleIcon', 'subTitle', 'page', 'accounts')); | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     private function subtract(array $startBalances, array $endBalances) | ||||
|     { | ||||
|         $result = []; | ||||
|   | ||||
| @@ -100,7 +100,7 @@ class ShowController extends Controller | ||||
|         $subTitleIcon     = config(sprintf('firefly.subIconsByIdentifier.%s', $account->accountType->type)); | ||||
|         $page             = (int) $request->get('page'); | ||||
|         $pageSize         = (int) app('preferences')->get('listPageSize', 50)->data; | ||||
|         $accountCurrency = $this->repository->getAccountCurrency($account); | ||||
|         $accountCurrency  = $this->repository->getAccountCurrency($account); | ||||
|         $currency         = $accountCurrency ?? Amount::getDefaultCurrency(); | ||||
|         $fStart           = $start->isoFormat($this->monthAndDayFormat); | ||||
|         $fEnd             = $end->isoFormat($this->monthAndDayFormat); | ||||
| @@ -131,7 +131,7 @@ class ShowController extends Controller | ||||
| 
 | ||||
|         $groups->setPath(route('accounts.show', [$account->id, $start->format('Y-m-d'), $end->format('Y-m-d')])); | ||||
|         $showAll          = false; | ||||
|         $balances          = Steam::filterAccountBalance(Steam::finalAccountBalance($account, $end), $account, $this->convertToNative, $accountCurrency); | ||||
|         $balances         = Steam::filterAccountBalance(Steam::finalAccountBalance($account, $end), $account, $this->convertToNative, $accountCurrency); | ||||
| 
 | ||||
|         return view( | ||||
|             'accounts.show', | ||||
|   | ||||
| @@ -85,11 +85,11 @@ class AccountController extends Controller | ||||
|         Log::debug('RevenueAccounts'); | ||||
| 
 | ||||
|         /** @var Carbon $start */ | ||||
|         $start = clone session('start', today(config('app.timezone'))->startOfMonth()); | ||||
|         $start         = clone session('start', today(config('app.timezone'))->startOfMonth()); | ||||
| 
 | ||||
|         /** @var Carbon $end */ | ||||
|         $end   = clone session('end', today(config('app.timezone'))->endOfMonth()); | ||||
|         $cache = new CacheProperties(); | ||||
|         $end           = clone session('end', today(config('app.timezone'))->endOfMonth()); | ||||
|         $cache         = new CacheProperties(); | ||||
|         $cache->addProperty($start); | ||||
|         $cache->addProperty($end); | ||||
|         $cache->addProperty($this->convertToNative); | ||||
| @@ -100,14 +100,14 @@ class AccountController extends Controller | ||||
|         $start->subDay(); | ||||
| 
 | ||||
|         // prep some vars:
 | ||||
|         $currencies = []; | ||||
|         $chartData  = []; | ||||
|         $tempData   = []; | ||||
|         $default    = Amount::getDefaultCurrency(); | ||||
|         $currencies    = []; | ||||
|         $chartData     = []; | ||||
|         $tempData      = []; | ||||
|         $default       = Amount::getDefaultCurrency(); | ||||
| 
 | ||||
|         // grab all accounts and names
 | ||||
|         $accounts     = $this->accountRepository->getAccountsByType([AccountTypeEnum::EXPENSE->value]); | ||||
|         $accountNames = $this->extractNames($accounts); | ||||
|         $accounts      = $this->accountRepository->getAccountsByType([AccountTypeEnum::EXPENSE->value]); | ||||
|         $accountNames  = $this->extractNames($accounts); | ||||
| 
 | ||||
|         // grab all balances
 | ||||
|         $startBalances = app('steam')->finalAccountsBalance($accounts, $start); | ||||
| @@ -139,13 +139,13 @@ class AccountController extends Controller | ||||
|                     continue; | ||||
|                 } | ||||
|                 Log::debug(sprintf('Will process expense array "%s" with amount %s', $key, $endBalance)); | ||||
|                 $searchCode = $this->convertToNative ? $default->code : $key; | ||||
|                 $searchCode   = $this->convertToNative ? $default->code : $key; | ||||
|                 Log::debug(sprintf('Search code is %s', $searchCode)); | ||||
|                 // see if there is an accompanying start amount.
 | ||||
|                 // grab the difference and find the currency.
 | ||||
|                 $startBalance = ($startBalances[$account->id][$key] ?? '0'); | ||||
|                 Log::debug(sprintf('Start balance is %s', $startBalance)); | ||||
|                 $diff                    = bcsub($endBalance, $startBalance); | ||||
|                 $diff         = bcsub($endBalance, $startBalance); | ||||
|                 $currencies[$searchCode] ??= $this->currencyRepository->findByCode($searchCode); | ||||
|                 if (0 !== bccomp($diff, '0')) { | ||||
|                     // store the values in a temporary array.
 | ||||
| @@ -163,10 +163,10 @@ class AccountController extends Controller | ||||
|         foreach ($currencies as $currency) { | ||||
|             $newCurrencies[$currency->id] = $currency; | ||||
|         } | ||||
|         $currencies = $newCurrencies; | ||||
|         $currencies    = $newCurrencies; | ||||
| 
 | ||||
|         // sort temp array by amount.
 | ||||
|         $amounts = array_column($tempData, 'diff_float'); | ||||
|         $amounts       = array_column($tempData, 'diff_float'); | ||||
|         array_multisort($amounts, SORT_DESC, $tempData); | ||||
| 
 | ||||
|         // loop all found currencies and build the data array for the chart.
 | ||||
| @@ -177,12 +177,12 @@ class AccountController extends Controller | ||||
|         foreach ($currencies as $currencyId => $currency) { | ||||
|             $dataSet | ||||
|                                     = [ | ||||
|                 'label'           => (string) trans('firefly.spent'), | ||||
|                 'type'            => 'bar', | ||||
|                 'currency_symbol' => $currency->symbol, | ||||
|                 'currency_code'   => $currency->code, | ||||
|                 'entries'         => $this->expandNames($tempData), | ||||
|             ]; | ||||
|                                         'label'           => (string) trans('firefly.spent'), | ||||
|                                         'type'            => 'bar', | ||||
|                                         'currency_symbol' => $currency->symbol, | ||||
|                                         'currency_code'   => $currency->code, | ||||
|                                         'entries'         => $this->expandNames($tempData), | ||||
|                                     ]; | ||||
|             $chartData[$currencyId] = $dataSet; | ||||
|         } | ||||
| 
 | ||||
| @@ -193,7 +193,7 @@ class AccountController extends Controller | ||||
|             $chartData[$currencyId]['entries'][$name] = (float) $entry['difference']; | ||||
|         } | ||||
| 
 | ||||
|         $data = $this->generator->multiSet($chartData); | ||||
|         $data          = $this->generator->multiSet($chartData); | ||||
|         $cache->store($data); | ||||
| 
 | ||||
|         return response()->json($data); | ||||
| @@ -215,7 +215,7 @@ class AccountController extends Controller | ||||
|      */ | ||||
|     public function expenseBudget(Account $account, Carbon $start, Carbon $end): JsonResponse | ||||
|     { | ||||
|         $cache = new CacheProperties(); | ||||
|         $cache     = new CacheProperties(); | ||||
|         $cache->addProperty($account->id); | ||||
|         $cache->addProperty($start); | ||||
|         $cache->addProperty($end); | ||||
| @@ -234,9 +234,9 @@ class AccountController extends Controller | ||||
| 
 | ||||
|         /** @var array $journal */ | ||||
|         foreach ($journals as $journal) { | ||||
|             $budgetId    = (int) $journal['budget_id']; | ||||
|             $key         = sprintf('%d-%d', $budgetId, $journal['currency_id']); | ||||
|             $budgetIds[] = $budgetId; | ||||
|             $budgetId              = (int) $journal['budget_id']; | ||||
|             $key                   = sprintf('%d-%d', $budgetId, $journal['currency_id']); | ||||
|             $budgetIds[]           = $budgetId; | ||||
|             if (!array_key_exists($key, $result)) { | ||||
|                 $result[$key] = [ | ||||
|                     'total'           => '0', | ||||
| @@ -249,7 +249,7 @@ class AccountController extends Controller | ||||
|             $result[$key]['total'] = bcadd($journal['amount'], $result[$key]['total']); | ||||
|         } | ||||
| 
 | ||||
|         $names = $this->getBudgetNames($budgetIds); | ||||
|         $names     = $this->getBudgetNames($budgetIds); | ||||
| 
 | ||||
|         foreach ($result as $row) { | ||||
|             $budgetId          = $row['budget_id']; | ||||
| @@ -258,7 +258,7 @@ class AccountController extends Controller | ||||
|             $chartData[$label] = ['amount' => $row['total'], 'currency_symbol' => $row['currency_symbol'], 'currency_code' => $row['currency_code']]; | ||||
|         } | ||||
| 
 | ||||
|         $data = $this->generator->multiCurrencyPieChart($chartData); | ||||
|         $data      = $this->generator->multiCurrencyPieChart($chartData); | ||||
|         $cache->store($data); | ||||
| 
 | ||||
|         return response()->json($data); | ||||
| @@ -280,7 +280,7 @@ class AccountController extends Controller | ||||
|      */ | ||||
|     public function expenseCategory(Account $account, Carbon $start, Carbon $end): JsonResponse | ||||
|     { | ||||
|         $cache = new CacheProperties(); | ||||
|         $cache     = new CacheProperties(); | ||||
|         $cache->addProperty($account->id); | ||||
|         $cache->addProperty($start); | ||||
|         $cache->addProperty($end); | ||||
| @@ -298,7 +298,7 @@ class AccountController extends Controller | ||||
| 
 | ||||
|         /** @var array $journal */ | ||||
|         foreach ($journals as $journal) { | ||||
|             $key = sprintf('%d-%d', $journal['category_id'], $journal['currency_id']); | ||||
|             $key                   = sprintf('%d-%d', $journal['category_id'], $journal['currency_id']); | ||||
|             if (!array_key_exists($key, $result)) { | ||||
|                 $result[$key] = [ | ||||
|                     'total'           => '0', | ||||
| @@ -310,7 +310,7 @@ class AccountController extends Controller | ||||
|             } | ||||
|             $result[$key]['total'] = bcadd($journal['amount'], $result[$key]['total']); | ||||
|         } | ||||
|         $names = $this->getCategoryNames(array_keys($result)); | ||||
|         $names     = $this->getCategoryNames(array_keys($result)); | ||||
| 
 | ||||
|         foreach ($result as $row) { | ||||
|             $categoryId        = $row['category_id']; | ||||
| @@ -319,7 +319,7 @@ class AccountController extends Controller | ||||
|             $chartData[$label] = ['amount' => $row['total'], 'currency_symbol' => $row['currency_symbol'], 'currency_code' => $row['currency_code']]; | ||||
|         } | ||||
| 
 | ||||
|         $data = $this->generator->multiCurrencyPieChart($chartData); | ||||
|         $data      = $this->generator->multiCurrencyPieChart($chartData); | ||||
|         $cache->store($data); | ||||
| 
 | ||||
|         return response()->json($data); | ||||
| @@ -332,9 +332,9 @@ class AccountController extends Controller | ||||
|      *                                              */ | ||||
|     public function frontpage(AccountRepositoryInterface $repository): JsonResponse | ||||
|     { | ||||
|         $start      = clone session('start', today(config('app.timezone'))->startOfMonth()); | ||||
|         $end        = clone session('end', today(config('app.timezone'))->endOfMonth()); | ||||
|         $defaultSet = $repository->getAccountsByType([AccountTypeEnum::DEFAULT->value, AccountTypeEnum::ASSET->value])->pluck('id')->toArray(); | ||||
|         $start          = clone session('start', today(config('app.timezone'))->startOfMonth()); | ||||
|         $end            = clone session('end', today(config('app.timezone'))->endOfMonth()); | ||||
|         $defaultSet     = $repository->getAccountsByType([AccountTypeEnum::DEFAULT->value, AccountTypeEnum::ASSET->value])->pluck('id')->toArray(); | ||||
|         Log::debug('Default set is ', $defaultSet); | ||||
|         $frontpage      = app('preferences')->get('frontpageAccounts', $defaultSet); | ||||
|         $frontpageArray = !is_array($frontpage->data) ? [] : $frontpage->data; | ||||
| @@ -343,7 +343,7 @@ class AccountController extends Controller | ||||
|             app('preferences')->set('frontpageAccounts', $defaultSet); | ||||
|             Log::debug('frontpage set is empty!'); | ||||
|         } | ||||
|         $accounts = $repository->getAccountsById($frontpageArray); | ||||
|         $accounts       = $repository->getAccountsById($frontpageArray); | ||||
| 
 | ||||
|         return response()->json($this->accountBalanceChart($accounts, $start, $end)); | ||||
|     } | ||||
| @@ -364,7 +364,7 @@ class AccountController extends Controller | ||||
|      */ | ||||
|     public function incomeCategory(Account $account, Carbon $start, Carbon $end): JsonResponse | ||||
|     { | ||||
|         $cache = new CacheProperties(); | ||||
|         $cache     = new CacheProperties(); | ||||
|         $cache->addProperty($account->id); | ||||
|         $cache->addProperty($start); | ||||
|         $cache->addProperty($end); | ||||
| @@ -384,7 +384,7 @@ class AccountController extends Controller | ||||
| 
 | ||||
|         /** @var array $journal */ | ||||
|         foreach ($journals as $journal) { | ||||
|             $key = sprintf('%d-%d', $journal['category_id'], $journal['currency_id']); | ||||
|             $key                   = sprintf('%d-%d', $journal['category_id'], $journal['currency_id']); | ||||
|             if (!array_key_exists($key, $result)) { | ||||
|                 $result[$key] = [ | ||||
|                     'total'           => '0', | ||||
| @@ -397,14 +397,14 @@ class AccountController extends Controller | ||||
|             $result[$key]['total'] = bcadd($journal['amount'], $result[$key]['total']); | ||||
|         } | ||||
| 
 | ||||
|         $names = $this->getCategoryNames(array_keys($result)); | ||||
|         $names     = $this->getCategoryNames(array_keys($result)); | ||||
|         foreach ($result as $row) { | ||||
|             $categoryId        = $row['category_id']; | ||||
|             $name              = $names[$categoryId] ?? '(unknown)'; | ||||
|             $label             = (string) trans('firefly.name_in_currency', ['name' => $name, 'currency' => $row['currency_name']]); | ||||
|             $chartData[$label] = ['amount' => $row['total'], 'currency_symbol' => $row['currency_symbol'], 'currency_code' => $row['currency_code']]; | ||||
|         } | ||||
|         $data = $this->generator->multiCurrencyPieChart($chartData); | ||||
|         $data      = $this->generator->multiCurrencyPieChart($chartData); | ||||
|         $cache->store($data); | ||||
| 
 | ||||
|         return response()->json($data); | ||||
| @@ -418,8 +418,8 @@ class AccountController extends Controller | ||||
|     public function period(Account $account, Carbon $start, Carbon $end): JsonResponse | ||||
|     { | ||||
|         Log::debug('Now in period()'); | ||||
|         $chartData = []; | ||||
|         $cache     = new CacheProperties(); | ||||
|         $chartData         = []; | ||||
|         $cache             = new CacheProperties(); | ||||
|         $cache->addProperty('chart.account.period'); | ||||
|         $cache->addProperty($start); | ||||
|         $cache->addProperty($end); | ||||
| @@ -430,57 +430,57 @@ class AccountController extends Controller | ||||
|         } | ||||
| 
 | ||||
|         // collect and filter balances for the entire period.
 | ||||
|         $step    = $this->calculateStep($start, $end); | ||||
|         $step              = $this->calculateStep($start, $end); | ||||
|         Log::debug(sprintf('Step is %s', $step)); | ||||
|         $locale  = app('steam')->getLocale(); | ||||
|         $return = []; | ||||
|         $locale            = app('steam')->getLocale(); | ||||
|         $return            = []; | ||||
|         // fix for issue https://github.com/firefly-iii/firefly-iii/issues/8041
 | ||||
|         // have to make sure this chart is always based on the balance at the END of the period.
 | ||||
|         // This period depends on the size of the chart
 | ||||
|         $current         = clone $start; | ||||
|         $current         = app('navigation')->endOfX($current, $step, null); | ||||
|         $format          = (string) trans('config.month_and_day_js', [], $locale); | ||||
|         $accountCurrency = $this->accountRepository->getAccountCurrency($account); | ||||
|         $current           = clone $start; | ||||
|         $current           = app('navigation')->endOfX($current, $step, null); | ||||
|         $format            = (string) trans('config.month_and_day_js', [], $locale); | ||||
|         $accountCurrency   = $this->accountRepository->getAccountCurrency($account); | ||||
| 
 | ||||
|         Log::debug('One'); | ||||
|         $range = Steam::finalAccountBalanceInRange($account, $start, $end, $this->convertToNative); | ||||
|         $range             = Steam::finalAccountBalanceInRange($account, $start, $end, $this->convertToNative); | ||||
|         Log::debug('Two'); | ||||
|         $range    = Steam::filterAccountBalances($range, $account, $this->convertToNative, $accountCurrency); | ||||
|         $range             = Steam::filterAccountBalances($range, $account, $this->convertToNative, $accountCurrency); | ||||
|         Log::debug('Three'); | ||||
|         $previous = array_values($range)[0]; | ||||
|         $accountCurrency = $accountCurrency ?? $this->defaultCurrency; // do this AFTER getting the balances.
 | ||||
|         $previous          = array_values($range)[0]; | ||||
|         $accountCurrency ??= $this->defaultCurrency; // do this AFTER getting the balances.
 | ||||
|         while ($end >= $current) { | ||||
|             $theDate = $current->format('Y-m-d'); | ||||
|             $theDate       = $current->format('Y-m-d'); | ||||
|             // each day contains multiple balances, and this may even be different over time.
 | ||||
|             $momentBalance = $range[$theDate] ?? $previous; | ||||
|             $return       = $this->updateChartKeys($return, $momentBalance); | ||||
|             $return        = $this->updateChartKeys($return, $momentBalance); | ||||
| 
 | ||||
|             // process each balance thing.
 | ||||
|             foreach($momentBalance as $key => $amount) { | ||||
|                 $label = $current->isoFormat($format); | ||||
|             foreach ($momentBalance as $key => $amount) { | ||||
|                 $label                           = $current->isoFormat($format); | ||||
|                 $return[$key]['entries'][$label] = $amount; | ||||
|             } | ||||
|             $current         = app('navigation')->addPeriod($current, $step, 0); | ||||
|             $current       = app('navigation')->addPeriod($current, $step, 0); | ||||
|             // here too, to fix #8041, the data is corrected to the end of the period.
 | ||||
|             $current = app('navigation')->endOfX($current, $step, null); | ||||
|             $previous = $momentBalance; | ||||
|             $current       = app('navigation')->endOfX($current, $step, null); | ||||
|             $previous      = $momentBalance; | ||||
|         } | ||||
|         // second loop (yes) to create nice array with info! Yay!
 | ||||
|         $chartData = []; | ||||
|         foreach($return as $key => $info) { | ||||
|             if(3 === strlen($key)) { | ||||
|         $chartData         = []; | ||||
|         foreach ($return as $key => $info) { | ||||
|             if (3 === strlen($key)) { | ||||
|                 // assume it's a currency:
 | ||||
|                 $setCurrency = $this->currencyRepository->findByCode($key); | ||||
|                 $setCurrency             = $this->currencyRepository->findByCode($key); | ||||
|                 $info['currency_symbol'] = $setCurrency->symbol; | ||||
|                 $info['currency_code']   = $setCurrency->code; | ||||
|                 $info['label']           = sprintf('%s (%s)', $account->name, $setCurrency->symbol); | ||||
|             } | ||||
|             if('balance' === $key) { | ||||
|             if ('balance' === $key) { | ||||
|                 $info['currency_symbol'] = $accountCurrency->symbol; | ||||
|                 $info['currency_code']   = $accountCurrency->code; | ||||
|                 $info['label']           = sprintf('%s (%s)', $account->name, $accountCurrency->symbol); | ||||
|             } | ||||
|             if('native_balance' === $key) { | ||||
|             if ('native_balance' === $key) { | ||||
|                 $info['currency_symbol'] = $this->defaultCurrency->symbol; | ||||
|                 $info['currency_code']   = $this->defaultCurrency->code; | ||||
|                 $info['label']           = sprintf('%s (%s) (%s)', $account->name, (string)trans('firefly.sum'), $this->defaultCurrency->symbol); | ||||
| @@ -488,25 +488,27 @@ class AccountController extends Controller | ||||
|             $chartData[] = $info; | ||||
|         } | ||||
| 
 | ||||
|         $data = $this->generator->multiSet($chartData); | ||||
|         $data              = $this->generator->multiSet($chartData); | ||||
|         $cache->store($data); | ||||
| 
 | ||||
|         return response()->json($data); | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|         var_dump($chartData);exit; | ||||
|         var_dump($chartData); | ||||
| 
 | ||||
|         exit; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|         $result  = [ | ||||
|         $result            = [ | ||||
|             'label'           => sprintf('%s (%s)', $account->name, $currency->symbol), | ||||
|             'currency_symbol' => $currency->symbol, | ||||
|             'currency_code'   => $currency->code, | ||||
|         ]; | ||||
|         $entries = []; | ||||
|         $current = clone $start; | ||||
|         $entries           = []; | ||||
|         $current           = clone $start; | ||||
| 
 | ||||
| 
 | ||||
|         Log::debug(sprintf('$current date is %s', $current->format('Y-m-d'))); | ||||
| @@ -532,7 +534,7 @@ class AccountController extends Controller | ||||
|                 $entries[$label] = $balance; | ||||
|                 $current         = app('navigation')->addPeriod($current, $step, 0); | ||||
|                 // here too, to fix #8041, the data is corrected to the end of the period.
 | ||||
|                 $current = app('navigation')->endOfX($current, $step, null); | ||||
|                 $current         = app('navigation')->endOfX($current, $step, null); | ||||
|             } | ||||
|         } | ||||
|         $result['entries'] = $entries; | ||||
| @@ -545,7 +547,7 @@ class AccountController extends Controller | ||||
|             $chartData[] = $this->periodByCurrency($start, $end, $account, $currency); | ||||
|         } | ||||
| 
 | ||||
|         $data = $this->generator->multiSet($chartData); | ||||
|         $data              = $this->generator->multiSet($chartData); | ||||
|         $cache->store($data); | ||||
| 
 | ||||
|         return response()->json($data); | ||||
| @@ -557,21 +559,21 @@ class AccountController extends Controller | ||||
|     private function periodByCurrency(Carbon $start, Carbon $end, Account $account, TransactionCurrency $currency): array | ||||
|     { | ||||
|         Log::debug(sprintf('Now in periodByCurrency("%s", "%s", %s, "%s")', $start->format('Y-m-d'), $end->format('Y-m-d'), $account->id, $currency->code)); | ||||
|         $locale  = app('steam')->getLocale(); | ||||
|         $step    = $this->calculateStep($start, $end); | ||||
|         $result  = [ | ||||
|         $locale            = app('steam')->getLocale(); | ||||
|         $step              = $this->calculateStep($start, $end); | ||||
|         $result            = [ | ||||
|             'label'           => sprintf('%s (%s)', $account->name, $currency->symbol), | ||||
|             'currency_symbol' => $currency->symbol, | ||||
|             'currency_code'   => $currency->code, | ||||
|         ]; | ||||
|         $entries = []; | ||||
|         $current = clone $start; | ||||
|         $entries           = []; | ||||
|         $current           = clone $start; | ||||
|         Log::debug(sprintf('Step is %s', $step)); | ||||
| 
 | ||||
|         // fix for issue https://github.com/firefly-iii/firefly-iii/issues/8041
 | ||||
|         // have to make sure this chart is always based on the balance at the END of the period.
 | ||||
|         // This period depends on the size of the chart
 | ||||
|         $current = app('navigation')->endOfX($current, $step, null); | ||||
|         $current           = app('navigation')->endOfX($current, $step, null); | ||||
|         Log::debug(sprintf('$current date is %s', $current->format('Y-m-d'))); | ||||
|         if ('1D' === $step) { | ||||
|             // per day the entire period, balance for every day.
 | ||||
| @@ -595,7 +597,7 @@ class AccountController extends Controller | ||||
|                 $entries[$label] = $balance; | ||||
|                 $current         = app('navigation')->addPeriod($current, $step, 0); | ||||
|                 // here too, to fix #8041, the data is corrected to the end of the period.
 | ||||
|                 $current = app('navigation')->endOfX($current, $step, null); | ||||
|                 $current         = app('navigation')->endOfX($current, $step, null); | ||||
|             } | ||||
|         } | ||||
|         $result['entries'] = $entries; | ||||
| @@ -623,11 +625,11 @@ class AccountController extends Controller | ||||
|     public function revenueAccounts(): JsonResponse | ||||
|     { | ||||
|         /** @var Carbon $start */ | ||||
|         $start = clone session('start', today(config('app.timezone'))->startOfMonth()); | ||||
|         $start         = clone session('start', today(config('app.timezone'))->startOfMonth()); | ||||
| 
 | ||||
|         /** @var Carbon $end */ | ||||
|         $end   = clone session('end', today(config('app.timezone'))->endOfMonth()); | ||||
|         $cache = new CacheProperties(); | ||||
|         $end           = clone session('end', today(config('app.timezone'))->endOfMonth()); | ||||
|         $cache         = new CacheProperties(); | ||||
|         $cache->addProperty($start); | ||||
|         $cache->addProperty($end); | ||||
|         $cache->addProperty($this->convertToNative); | ||||
| @@ -638,14 +640,14 @@ class AccountController extends Controller | ||||
|         $start->subDay(); | ||||
| 
 | ||||
|         // prep some vars:
 | ||||
|         $currencies = []; | ||||
|         $chartData  = []; | ||||
|         $tempData   = []; | ||||
|         $default    = Amount::getDefaultCurrency(); | ||||
|         $currencies    = []; | ||||
|         $chartData     = []; | ||||
|         $tempData      = []; | ||||
|         $default       = Amount::getDefaultCurrency(); | ||||
| 
 | ||||
|         // grab all accounts and names
 | ||||
|         $accounts     = $this->accountRepository->getAccountsByType([AccountTypeEnum::REVENUE->value]); | ||||
|         $accountNames = $this->extractNames($accounts); | ||||
|         $accounts      = $this->accountRepository->getAccountsByType([AccountTypeEnum::REVENUE->value]); | ||||
|         $accountNames  = $this->extractNames($accounts); | ||||
| 
 | ||||
|         // grab all balances
 | ||||
|         $startBalances = app('steam')->finalAccountsBalance($accounts, $start); | ||||
| @@ -678,13 +680,13 @@ class AccountController extends Controller | ||||
|                     continue; | ||||
|                 } | ||||
|                 Log::debug(sprintf('Will process expense array "%s" with amount %s', $key, $endBalance)); | ||||
|                 $searchCode = $this->convertToNative ? $default->code : $key; | ||||
|                 $searchCode   = $this->convertToNative ? $default->code : $key; | ||||
|                 Log::debug(sprintf('Search code is %s', $searchCode)); | ||||
|                 // see if there is an accompanying start amount.
 | ||||
|                 // grab the difference and find the currency.
 | ||||
|                 $startBalance = ($startBalances[$account->id][$key] ?? '0'); | ||||
|                 Log::debug(sprintf('Start balance is %s', $startBalance)); | ||||
|                 $diff                    = bcsub($endBalance, $startBalance); | ||||
|                 $diff         = bcsub($endBalance, $startBalance); | ||||
|                 $currencies[$searchCode] ??= $this->currencyRepository->findByCode($searchCode); | ||||
|                 if (0 !== bccomp($diff, '0')) { | ||||
|                     // store the values in a temporary array.
 | ||||
| @@ -704,10 +706,10 @@ class AccountController extends Controller | ||||
|         foreach ($currencies as $currency) { | ||||
|             $newCurrencies[$currency->id] = $currency; | ||||
|         } | ||||
|         $currencies = $newCurrencies; | ||||
|         $currencies    = $newCurrencies; | ||||
| 
 | ||||
|         // sort temp array by amount.
 | ||||
|         $amounts = array_column($tempData, 'diff_float'); | ||||
|         $amounts       = array_column($tempData, 'diff_float'); | ||||
|         array_multisort($amounts, SORT_ASC, $tempData); | ||||
| 
 | ||||
|         // loop all found currencies and build the data array for the chart.
 | ||||
| @@ -718,12 +720,12 @@ class AccountController extends Controller | ||||
|         foreach ($currencies as $currencyId => $currency) { | ||||
|             $dataSet | ||||
|                                     = [ | ||||
|                 'label'           => (string) trans('firefly.earned'), | ||||
|                 'type'            => 'bar', | ||||
|                 'currency_symbol' => $currency->symbol, | ||||
|                 'currency_code'   => $currency->code, | ||||
|                 'entries'         => $this->expandNames($tempData), | ||||
|             ]; | ||||
|                                         'label'           => (string) trans('firefly.earned'), | ||||
|                                         'type'            => 'bar', | ||||
|                                         'currency_symbol' => $currency->symbol, | ||||
|                                         'currency_code'   => $currency->code, | ||||
|                                         'entries'         => $this->expandNames($tempData), | ||||
|                                     ]; | ||||
|             $chartData[$currencyId] = $dataSet; | ||||
|         } | ||||
| 
 | ||||
| @@ -734,7 +736,7 @@ class AccountController extends Controller | ||||
|             $chartData[$currencyId]['entries'][$name] = bcmul($entry['difference'], '-1'); | ||||
|         } | ||||
| 
 | ||||
|         $data = $this->generator->multiSet($chartData); | ||||
|         $data          = $this->generator->multiSet($chartData); | ||||
|         $cache->store($data); | ||||
| 
 | ||||
|         return response()->json($data); | ||||
| @@ -747,6 +749,7 @@ class AccountController extends Controller | ||||
|                 'key' => $key, | ||||
|             ]; | ||||
|         } | ||||
| 
 | ||||
|         return $array; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -38,8 +38,8 @@ class Steam | ||||
| { | ||||
|     public function getAccountCurrency(Account $account): ?TransactionCurrency | ||||
|     { | ||||
|         $type = $account->accountType->type; | ||||
|         $list = config('firefly.valid_currency_account_types'); | ||||
|         $type   = $account->accountType->type; | ||||
|         $list   = config('firefly.valid_currency_account_types'); | ||||
| 
 | ||||
|         // return null if not in this list.
 | ||||
|         if (!in_array($type, $list, true)) { | ||||
| @@ -77,7 +77,7 @@ class Steam | ||||
|         Log::debug(sprintf('finalAccountBalanceInRange(#%d, %s, %s)', $account->id, $start->format('Y-m-d H:i:s'), $end->format('Y-m-d H:i:s'))); | ||||
| 
 | ||||
|         // set up cache
 | ||||
|         $cache = new CacheProperties(); | ||||
|         $cache                = new CacheProperties(); | ||||
|         $cache->addProperty($account->id); | ||||
|         $cache->addProperty('final-balance-in-range'); | ||||
|         $cache->addProperty($start); | ||||
| @@ -86,13 +86,13 @@ class Steam | ||||
|             // return $cache->get();
 | ||||
|         } | ||||
| 
 | ||||
|         $balances        = []; | ||||
|         $formatted       = $start->format('Y-m-d'); | ||||
|         $startBalance    = $this->finalAccountBalance($account, $start); | ||||
|         $defaultCurrency = app('amount')->getDefaultCurrencyByUserGroup($account->user->userGroup); | ||||
|         $accountCurrency = $this->getAccountCurrency($account); | ||||
|         $hasCurrency     = null !== $accountCurrency; | ||||
|         $currency        = $accountCurrency ?? $defaultCurrency; | ||||
|         $balances             = []; | ||||
|         $formatted            = $start->format('Y-m-d'); | ||||
|         $startBalance         = $this->finalAccountBalance($account, $start); | ||||
|         $defaultCurrency      = app('amount')->getDefaultCurrencyByUserGroup($account->user->userGroup); | ||||
|         $accountCurrency      = $this->getAccountCurrency($account); | ||||
|         $hasCurrency          = null !== $accountCurrency; | ||||
|         $currency             = $accountCurrency ?? $defaultCurrency; | ||||
|         Log::debug(sprintf('Currency is %s', $currency->code)); | ||||
|         if (!$hasCurrency) { | ||||
|             Log::debug(sprintf('Also set start balance in %s', $defaultCurrency->code)); | ||||
| @@ -105,89 +105,90 @@ class Steam | ||||
| 
 | ||||
| 
 | ||||
|         $startBalance[$currency->code] ??= '0'; | ||||
|         $balances[$formatted]          = $startBalance; | ||||
|         $balances[$formatted] = $startBalance; | ||||
|         Log::debug('Final start balance: ', $startBalance); | ||||
| 
 | ||||
| 
 | ||||
|         // sums up the balance changes per day, for foreign, native and normal amounts.
 | ||||
|         $set = $account->transactions() | ||||
|                        ->leftJoin('transaction_journals', 'transactions.transaction_journal_id', '=', 'transaction_journals.id') | ||||
|                        ->where('transaction_journals.date', '>=', $start->format('Y-m-d H:i:s')) | ||||
|                        ->where('transaction_journals.date', '<=', $end->format('Y-m-d  H:i:s')) | ||||
|                        ->groupBy('transaction_journals.date') | ||||
|                        ->groupBy('transactions.transaction_currency_id') | ||||
|                        ->groupBy('transactions.foreign_currency_id') | ||||
|                        ->orderBy('transaction_journals.date', 'ASC') | ||||
|                        ->whereNull('transaction_journals.deleted_at') | ||||
|                        ->get( | ||||
|                            [ // @phpstan-ignore-line
 | ||||
|                              'transaction_journals.date', | ||||
|                              'transactions.transaction_currency_id', | ||||
|                              \DB::raw('SUM(transactions.amount) AS modified'), | ||||
|                              'transactions.foreign_currency_id', | ||||
|                              \DB::raw('SUM(transactions.foreign_amount) AS modified_foreign'), | ||||
|                              \DB::raw('SUM(transactions.native_amount) AS modified_native'), | ||||
|                            ] | ||||
|                        ); | ||||
|         $set                  = $account->transactions() | ||||
|             ->leftJoin('transaction_journals', 'transactions.transaction_journal_id', '=', 'transaction_journals.id') | ||||
|             ->where('transaction_journals.date', '>=', $start->format('Y-m-d H:i:s')) | ||||
|             ->where('transaction_journals.date', '<=', $end->format('Y-m-d  H:i:s')) | ||||
|             ->groupBy('transaction_journals.date') | ||||
|             ->groupBy('transactions.transaction_currency_id') | ||||
|             ->groupBy('transactions.foreign_currency_id') | ||||
|             ->orderBy('transaction_journals.date', 'ASC') | ||||
|             ->whereNull('transaction_journals.deleted_at') | ||||
|             ->get( | ||||
|                 [ // @phpstan-ignore-line
 | ||||
|                     'transaction_journals.date', | ||||
|                     'transactions.transaction_currency_id', | ||||
|                     \DB::raw('SUM(transactions.amount) AS modified'), | ||||
|                     'transactions.foreign_currency_id', | ||||
|                     \DB::raw('SUM(transactions.foreign_amount) AS modified_foreign'), | ||||
|                     \DB::raw('SUM(transactions.native_amount) AS modified_native'), | ||||
|                 ] | ||||
|             ) | ||||
|         ; | ||||
| 
 | ||||
|         $currentBalance = $startBalance; | ||||
|         $currentBalance       = $startBalance; | ||||
| 
 | ||||
|         /** @var Transaction $entry */ | ||||
|         foreach ($set as $entry) { | ||||
|             // normal, native and foreign amount
 | ||||
|             $carbon          = new Carbon($entry->date, $entry->date_tz); | ||||
|             $modified        = (string) (null === $entry->modified ? '0' : $entry->modified); | ||||
|             $foreignModified = (string) (null === $entry->modified_foreign ? '0' : $entry->modified_foreign); | ||||
|             $nativeModified  = (string) (null === $entry->modified_native ? '0' : $entry->modified_native); | ||||
|             $carbon                             = new Carbon($entry->date, $entry->date_tz); | ||||
|             $modified                           = (string) (null === $entry->modified ? '0' : $entry->modified); | ||||
|             $foreignModified                    = (string) (null === $entry->modified_foreign ? '0' : $entry->modified_foreign); | ||||
|             $nativeModified                     = (string) (null === $entry->modified_native ? '0' : $entry->modified_native); | ||||
| 
 | ||||
|             // find currency of this entry.
 | ||||
|             $currencies[$entry->transaction_currency_id] = $currencies[$entry->transaction_currency_id] ?? TransactionCurrency::find($entry->transaction_currency_id); | ||||
|             $entryCurrency = $currencies[$entry->transaction_currency_id]; | ||||
|             $currencies[$entry->transaction_currency_id] ??= TransactionCurrency::find($entry->transaction_currency_id); | ||||
|             $entryCurrency                      = $currencies[$entry->transaction_currency_id]; | ||||
| 
 | ||||
|             Log::debug(sprintf('Processing transaction(s) on date %s', $carbon->format('Y-m-d H:i:s'))); | ||||
| 
 | ||||
|             // if convert to native, if NOT convert to native.
 | ||||
|             if($convertToNative) { | ||||
|             if ($convertToNative) { | ||||
|                 Log::debug(sprintf('Amount is %s %s, foreign amount is %s, native amount is %s', $entryCurrency->code, $modified, $foreignModified, $nativeModified)); | ||||
|                 // add to native balance.
 | ||||
|                 $currentBalance['native_balance']       = bcadd($currentBalance['native_balance'], $nativeModified); | ||||
|                 if($entry->foreign_currency_id === $defaultCurrency->id) { | ||||
|                     $currentBalance['native_balance']       = bcadd($currentBalance['native_balance'], $foreignModified); | ||||
|                 $currentBalance['native_balance']     = bcadd($currentBalance['native_balance'], $nativeModified); | ||||
|                 if ($entry->foreign_currency_id === $defaultCurrency->id) { | ||||
|                     $currentBalance['native_balance'] = bcadd($currentBalance['native_balance'], $foreignModified); | ||||
|                 } | ||||
|                 // add to balance if is the same.
 | ||||
|                 if($entry->transaction_currency_id === $accountCurrency?->id) { | ||||
|                     $currentBalance['balance']       = bcadd($currentBalance['balance'], $modified); | ||||
|                 if ($entry->transaction_currency_id === $accountCurrency?->id) { | ||||
|                     $currentBalance['balance'] = bcadd($currentBalance['balance'], $modified); | ||||
|                 } | ||||
|                 // add currency balance
 | ||||
|                 $currentBalance[$entryCurrency->code] = bcadd($currentBalance[$entryCurrency->code], $modified); | ||||
|             } | ||||
|             if(!$convertToNative) { | ||||
|             if (!$convertToNative) { | ||||
|                 Log::debug(sprintf('Amount is %s %s, foreign amount is %s, native amount is %s', $entryCurrency->code, $modified, $foreignModified, $nativeModified)); | ||||
|                 // add to balance, as expected.
 | ||||
|                 $currentBalance['balance']       = bcadd($currentBalance['balance'] ?? '0', $modified); | ||||
|                 $currentBalance['balance']            = bcadd($currentBalance['balance'] ?? '0', $modified); | ||||
|                 // add to GBP, as expected.
 | ||||
|                 $currentBalance[$entryCurrency->code] = bcadd($currentBalance[$entryCurrency->code], $modified); | ||||
|             } | ||||
| 
 | ||||
| //            // add "modified" to amount if the currency id matches the account currency id.
 | ||||
| //            if ($entry->transaction_currency_id === $currency->id) {
 | ||||
| //                $currentBalance['balance']       = bcadd($currentBalance['balance'], $modified);
 | ||||
| //                $currentBalance[$currency->code] = bcadd($currentBalance[$currency->code], $modified);
 | ||||
| //            }
 | ||||
| //
 | ||||
| //            // always add the native balance, even if it ends up at zero.
 | ||||
| //            $currentBalance['native_balance'] = bcadd($currentBalance['native_balance'], $nativeModified);
 | ||||
|             //            // add "modified" to amount if the currency id matches the account currency id.
 | ||||
|             //            if ($entry->transaction_currency_id === $currency->id) {
 | ||||
|             //                $currentBalance['balance']       = bcadd($currentBalance['balance'], $modified);
 | ||||
|             //                $currentBalance[$currency->code] = bcadd($currentBalance[$currency->code], $modified);
 | ||||
|             //            }
 | ||||
|             //
 | ||||
|             //            // always add the native balance, even if it ends up at zero.
 | ||||
|             //            $currentBalance['native_balance'] = bcadd($currentBalance['native_balance'], $nativeModified);
 | ||||
| 
 | ||||
|             // DO NOT add modified foreign to the array
 | ||||
| //            if (null !== $entry->foreign_currency_id) {
 | ||||
| //                $foreignId                              = $entry->foreign_currency_id;
 | ||||
| //                $currencies[$foreignId]                 ??= TransactionCurrency::find($foreignId);
 | ||||
| //                $foreignCurrency                        = $currencies[$foreignId];
 | ||||
| //                $currentBalance[$foreignCurrency->code] ??= '0';
 | ||||
| //                $currentBalance[$foreignCurrency->code] = bcadd($currentBalance[$foreignCurrency->code], $foreignModified);
 | ||||
| //            }
 | ||||
|             //            if (null !== $entry->foreign_currency_id) {
 | ||||
|             //                $foreignId                              = $entry->foreign_currency_id;
 | ||||
|             //                $currencies[$foreignId]                 ??= TransactionCurrency::find($foreignId);
 | ||||
|             //                $foreignCurrency                        = $currencies[$foreignId];
 | ||||
|             //                $currentBalance[$foreignCurrency->code] ??= '0';
 | ||||
|             //                $currentBalance[$foreignCurrency->code] = bcadd($currentBalance[$foreignCurrency->code], $foreignModified);
 | ||||
|             //            }
 | ||||
|             $balances[$carbon->format('Y-m-d')] = $currentBalance; | ||||
|             Log::debug('Updated entry',$currentBalance); | ||||
|             Log::debug('Updated entry', $currentBalance); | ||||
|         } | ||||
|         $cache->store($balances); | ||||
| 
 | ||||
| @@ -223,10 +224,10 @@ class Steam | ||||
|         // Log::debug(sprintf('Trying bcround("%s",%d)', $number, $precision));
 | ||||
|         if (str_contains($number, '.')) { | ||||
|             if ('-' !== $number[0]) { | ||||
|                 return bcadd($number, '0.' . str_repeat('0', $precision) . '5', $precision); | ||||
|                 return bcadd($number, '0.'.str_repeat('0', $precision).'5', $precision); | ||||
|             } | ||||
| 
 | ||||
|             return bcsub($number, '0.' . str_repeat('0', $precision) . '5', $precision); | ||||
|             return bcsub($number, '0.'.str_repeat('0', $precision).'5', $precision); | ||||
|         } | ||||
| 
 | ||||
|         return $number; | ||||
| @@ -325,11 +326,12 @@ class Steam | ||||
|         // first, the "balance", as described earlier.
 | ||||
|         if ($convertToNative) { | ||||
|             // normal balance
 | ||||
|             $return['balance'] = (string) $account->transactions() | ||||
|                                                   ->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id') | ||||
|                                                   ->where('transaction_journals.date', '<=', $date->format('Y-m-d H:i:s')) | ||||
|                                                   ->where('transactions.transaction_currency_id', $native->id) | ||||
|                                                   ->sum('transactions.amount'); | ||||
|             $return['balance']        = (string) $account->transactions() | ||||
|                 ->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id') | ||||
|                 ->where('transaction_journals.date', '<=', $date->format('Y-m-d H:i:s')) | ||||
|                 ->where('transactions.transaction_currency_id', $native->id) | ||||
|                 ->sum('transactions.amount') | ||||
|             ; | ||||
|             // plus virtual balance, if the account has a virtual_balance in the native currency
 | ||||
|             if ($native->id === $accountCurrency?->id) { | ||||
|                 $return['balance'] = bcadd('' === (string) $account->virtual_balance ? '0' : $account->virtual_balance, $return['balance']); | ||||
| @@ -338,33 +340,36 @@ class Steam | ||||
| 
 | ||||
|             // native balance
 | ||||
|             $return['native_balance'] = (string) $account->transactions() | ||||
|                                                          ->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id') | ||||
|                                                          ->where('transaction_journals.date', '<=', $date->format('Y-m-d H:i:s')) | ||||
|                                                          ->whereNot('transactions.transaction_currency_id', $native->id) | ||||
|                                                          ->sum('transactions.native_amount'); | ||||
|                 ->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id') | ||||
|                 ->where('transaction_journals.date', '<=', $date->format('Y-m-d H:i:s')) | ||||
|                 ->whereNot('transactions.transaction_currency_id', $native->id) | ||||
|                 ->sum('transactions.native_amount') | ||||
|             ; | ||||
|             // plus native virtual balance.
 | ||||
|             $return['native_balance'] = bcadd('' === (string) $account->native_virtual_balance ? '0' : $account->native_virtual_balance, $return['native_balance']); | ||||
|             Log::debug(sprintf('native_balance is (all transactions to %s) %s (with virtual balance)', $native->code, $return['native_balance'])); | ||||
| 
 | ||||
|             // plus foreign transactions in THIS currency.
 | ||||
|             $sum                      = (string) $account->transactions() | ||||
|                                                          ->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id') | ||||
|                                                          ->where('transaction_journals.date', '<=', $date->format('Y-m-d H:i:s')) | ||||
|                                                          ->whereNot('transactions.transaction_currency_id', $native->id) | ||||
|                                                          ->where('transactions.foreign_currency_id', $native->id) | ||||
|                                                          ->sum('transactions.foreign_amount'); | ||||
|                 ->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id') | ||||
|                 ->where('transaction_journals.date', '<=', $date->format('Y-m-d H:i:s')) | ||||
|                 ->whereNot('transactions.transaction_currency_id', $native->id) | ||||
|                 ->where('transactions.foreign_currency_id', $native->id) | ||||
|                 ->sum('transactions.foreign_amount') | ||||
|             ; | ||||
|             $return['native_balance'] = bcadd($return['native_balance'], $sum); | ||||
| 
 | ||||
|             Log::debug(sprintf('Foreign amount transactions add (%s only) %s, total native_balance is now %s', $native->code, $sum, $return['native_balance'])); | ||||
|         } | ||||
| 
 | ||||
|         // balance(s) in other (all) currencies.
 | ||||
|         $array  = $account->transactions() | ||||
|                           ->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id') | ||||
|                           ->leftJoin('transaction_currencies', 'transaction_currencies.id', '=', 'transactions.transaction_currency_id') | ||||
|                           ->where('transaction_journals.date', '<=', $date->format('Y-m-d H:i:s')) | ||||
|                           ->get(['transaction_currencies.code', 'transactions.amount'])->toArray(); | ||||
|         $others = $this->groupAndSumTransactions($array, 'code', 'amount'); | ||||
|         $array           = $account->transactions() | ||||
|             ->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id') | ||||
|             ->leftJoin('transaction_currencies', 'transaction_currencies.id', '=', 'transactions.transaction_currency_id') | ||||
|             ->where('transaction_journals.date', '<=', $date->format('Y-m-d H:i:s')) | ||||
|             ->get(['transaction_currencies.code', 'transactions.amount'])->toArray() | ||||
|         ; | ||||
|         $others          = $this->groupAndSumTransactions($array, 'code', 'amount'); | ||||
|         Log::debug('All balances are (joined)', $others); | ||||
|         // if the account has no own currency preference, drop balance in favor of native balance
 | ||||
|         if ($hasCurrency && !$convertToNative) { | ||||
| @@ -380,13 +385,14 @@ class Steam | ||||
| 
 | ||||
|         if (!$hasCurrency && array_key_exists('balance', $return) && array_key_exists('native_balance', $return)) { | ||||
|             Log::debug('Account has no currency preference, dropping balance in favor of native balance.'); | ||||
|             $sum = bcadd($return['balance'], $return['native_balance']); | ||||
|             $sum                      = bcadd($return['balance'], $return['native_balance']); | ||||
|             Log::debug(sprintf('%s + %s = %s', $return['balance'], $return['native_balance'], $sum)); | ||||
|             $return['native_balance'] = $sum; | ||||
|             unset($return['balance']); | ||||
|         } | ||||
|         $final = array_merge($return, $others); | ||||
|         $final           = array_merge($return, $others); | ||||
|         Log::debug('Return is', $final); | ||||
| 
 | ||||
|         return $final; | ||||
|     } | ||||
| 
 | ||||
| @@ -398,6 +404,7 @@ class Steam | ||||
|             $return[$key] = $this->filterAccountBalance($value, $account, $convertToNative, $currency); | ||||
|         } | ||||
|         Log::debug(sprintf('end of filterAccountBalances(#%d)', $account->id)); | ||||
| 
 | ||||
|         return $return; | ||||
|     } | ||||
| 
 | ||||
| @@ -406,6 +413,7 @@ class Steam | ||||
|         Log::debug(sprintf('filterAccountBalance(#%d)', $account->id), $set); | ||||
|         if (0 === count($set)) { | ||||
|             Log::debug(sprintf('Return empty array for account #%d', $account->id)); | ||||
| 
 | ||||
|             return []; | ||||
|         } | ||||
|         $defaultCurrency = app('amount')->getDefaultCurrency(); | ||||
| @@ -421,7 +429,7 @@ class Steam | ||||
| 
 | ||||
|             if (null === $currency) { | ||||
|                 Log::debug(sprintf('TEMP DO NOT Drop defaultCurrency balance for account #%d', $account->id)); | ||||
|                 //unset($set[$this->defaultCurrency->code]);
 | ||||
|                 // unset($set[$this->defaultCurrency->code]);
 | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
| @@ -488,15 +496,15 @@ class Steam | ||||
|     { | ||||
|         $list = []; | ||||
| 
 | ||||
|         $set = auth()->user()->transactions() | ||||
|                      ->whereIn('transactions.account_id', $accounts) | ||||
|                      ->groupBy(['transactions.account_id', 'transaction_journals.user_id']) | ||||
|                      ->get(['transactions.account_id', \DB::raw('MAX(transaction_journals.date) AS max_date')]) // @phpstan-ignore-line
 | ||||
|         $set  = auth()->user()->transactions() | ||||
|             ->whereIn('transactions.account_id', $accounts) | ||||
|             ->groupBy(['transactions.account_id', 'transaction_journals.user_id']) | ||||
|             ->get(['transactions.account_id', \DB::raw('MAX(transaction_journals.date) AS max_date')]) // @phpstan-ignore-line
 | ||||
|         ; | ||||
| 
 | ||||
|         /** @var Transaction $entry */ | ||||
|         foreach ($set as $entry) { | ||||
|             $date = new Carbon($entry->max_date, config('app.timezone')); | ||||
|             $date                           = new Carbon($entry->max_date, config('app.timezone')); | ||||
|             $date->setTimezone(config('app.timezone')); | ||||
|             $list[(int) $entry->account_id] = $date; | ||||
|         } | ||||
| @@ -571,9 +579,9 @@ class Steam | ||||
|     public function getSafeUrl(string $unknownUrl, string $safeUrl): string | ||||
|     { | ||||
|         // Log::debug(sprintf('getSafeUrl(%s, %s)', $unknownUrl, $safeUrl));
 | ||||
|         $returnUrl   = $safeUrl; | ||||
|         $unknownHost = parse_url($unknownUrl, PHP_URL_HOST); | ||||
|         $safeHost    = parse_url($safeUrl, PHP_URL_HOST); | ||||
|         $returnUrl      = $safeUrl; | ||||
|         $unknownHost    = parse_url($unknownUrl, PHP_URL_HOST); | ||||
|         $safeHost       = parse_url($safeUrl, PHP_URL_HOST); | ||||
| 
 | ||||
|         if (null !== $unknownHost && $unknownHost === $safeHost) { | ||||
|             $returnUrl = $unknownUrl; | ||||
| @@ -610,7 +618,7 @@ class Steam | ||||
|      */ | ||||
|     public function floatalize(string $value): string | ||||
|     { | ||||
|         $value = strtoupper($value); | ||||
|         $value  = strtoupper($value); | ||||
|         if (!str_contains($value, 'E')) { | ||||
|             return $value; | ||||
|         } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user