diff --git a/app/Api/V1/Controllers/Autocomplete/AccountController.php b/app/Api/V1/Controllers/Autocomplete/AccountController.php index 575458af5c..03e1df4d77 100644 --- a/app/Api/V1/Controllers/Autocomplete/AccountController.php +++ b/app/Api/V1/Controllers/Autocomplete/AccountController.php @@ -34,6 +34,7 @@ use FireflyIII\Support\Facades\Steam; use FireflyIII\Support\Http\Api\AccountFilter; use FireflyIII\User; use Illuminate\Http\JsonResponse; +use Illuminate\Support\Facades\Log; /** * Class AccountController @@ -83,8 +84,8 @@ class AccountController extends Controller $return = []; $result = $this->repository->searchAccount((string) $query, $types, $this->parameters->get('limit')); - // set date to end-of-day for account balance. - $date->endOfDay(); + // set date to subday + end-of-day for account balance. so it is at $date 23:59:59 + $date->subDay()->endOfDay(); /** @var Account $account */ foreach ($result as $account) { @@ -92,6 +93,7 @@ class AccountController extends Controller $currency = $this->repository->getAccountCurrency($account) ?? $this->nativeCurrency; $useCurrency = $currency; if (in_array($account->accountType->type, $this->balanceTypes, true)) { + Log::debug(sprintf('accounts: Call finalAccountBalance with date/time "%s"', $date->toIso8601String())); $balance = Steam::finalAccountBalance($account, $date); $key = $this->convertToNative && $currency->id !== $this->nativeCurrency->id ? 'native_balance' : 'balance'; $useCurrency = $this->convertToNative && $currency->id !== $this->nativeCurrency->id ? $this->nativeCurrency : $currency; diff --git a/app/Generator/Report/Audit/MonthReportGenerator.php b/app/Generator/Report/Audit/MonthReportGenerator.php index 2a4eb211b9..bfa87e9b80 100644 --- a/app/Generator/Report/Audit/MonthReportGenerator.php +++ b/app/Generator/Report/Audit/MonthReportGenerator.php @@ -33,6 +33,7 @@ use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Support\Facades\Steam; use Illuminate\Support\Collection; +use Illuminate\Support\Facades\Log; /** * Class MonthReportGenerator. @@ -52,10 +53,9 @@ class MonthReportGenerator implements ReportGeneratorInterface { $auditData = []; $dayBefore = clone $this->start; - $dayBefore->subDay(); - // move to end of day - $dayBefore->endOfDay(); + // set date to subday + end-of-day for account balance. so it is at $date 23:59:59 + $dayBefore->subDay()->endOfDay(); /** @var Account $account */ foreach ($this->accounts as $account) { @@ -136,6 +136,7 @@ class MonthReportGenerator implements ReportGeneratorInterface ; $journals = $collector->getExtractedJournals(); $journals = array_reverse($journals, true); + Log::debug(sprintf('getAuditReport: Call finalAccountBalance with date/time "%s"', $date->toIso8601String())); $dayBeforeBalance = Steam::finalAccountBalance($account, $date); $startBalance = $dayBeforeBalance['balance']; $defaultCurrency = app('amount')->getNativeCurrencyByUserGroup($account->user->userGroup); @@ -170,7 +171,7 @@ class MonthReportGenerator implements ReportGeneratorInterface $journals[$index]['invoice_date'] = $journalRepository->getMetaDateById($journal['transaction_journal_id'], 'invoice_date'); } $locale = app('steam')->getLocale(); - + Log::debug(sprintf('getAuditReport end: Call finalAccountBalance with date/time "%s"', $this->end->toIso8601String())); return [ 'journals' => $journals, 'currency' => $currency, diff --git a/app/Helpers/Collector/Extensions/AccountCollection.php b/app/Helpers/Collector/Extensions/AccountCollection.php index d96a49f321..aa1ae451d9 100644 --- a/app/Helpers/Collector/Extensions/AccountCollection.php +++ b/app/Helpers/Collector/Extensions/AccountCollection.php @@ -258,7 +258,12 @@ trait AccountCollection if (null === $account) { continue; } - $balance = Steam::finalAccountBalance($account, $transaction['date']); + // the balance must be found BEFORE the transaction date. + // so sub one second. This is not perfect, but works well enough. + $date = clone $transaction['date']; + $date->subSecond(); + Log::debug(sprintf('accountBalanceIs: Call finalAccountBalance with date/time "%s"', $date->toIso8601String())); + $balance = Steam::finalAccountBalance($account, $date); $result = bccomp($balance['balance'], $value); Log::debug(sprintf('"%s" vs "%s" is %d', $balance['balance'], $value, $result)); diff --git a/app/Http/Controllers/Account/ReconcileController.php b/app/Http/Controllers/Account/ReconcileController.php index 0b7955a42c..d0fd078e87 100644 --- a/app/Http/Controllers/Account/ReconcileController.php +++ b/app/Http/Controllers/Account/ReconcileController.php @@ -39,6 +39,7 @@ use FireflyIII\User; use Illuminate\Contracts\View\Factory; use Illuminate\Http\RedirectResponse; use Illuminate\Routing\Redirector; +use Illuminate\Support\Facades\Log; use Illuminate\View\View; /** @@ -113,7 +114,9 @@ class ReconcileController extends Controller $end->endOfDay(); $startDate = clone $start; - $startDate->subDay()->endOfDay(); + $startDate->subDay()->endOfDay(); // this is correct, subday endofday ends at 23:59:59 + Log::debug(sprintf('reconcile: Call finalAccountBalance with date/time "%s"', $startDate->toIso8601String())); + Log::debug(sprintf('reconcile2: Call finalAccountBalance with date/time "%s"', $end->toIso8601String())); $startBalance = Steam::bcround(Steam::finalAccountBalance($account, $startDate)['balance'], $currency->decimal_places); $endBalance = Steam::bcround(Steam::finalAccountBalance($account, $end)['balance'], $currency->decimal_places); $subTitleIcon = config(sprintf('firefly.subIconsByIdentifier.%s', $account->accountType->type)); diff --git a/app/Http/Controllers/Account/ShowController.php b/app/Http/Controllers/Account/ShowController.php index 12b1e24b94..d88dab8fdc 100644 --- a/app/Http/Controllers/Account/ShowController.php +++ b/app/Http/Controllers/Account/ShowController.php @@ -37,6 +37,7 @@ use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Routing\Redirector; use Illuminate\Support\Collection; +use Illuminate\Support\Facades\Log; use Illuminate\View\View; /** @@ -135,6 +136,7 @@ class ShowController extends Controller $groups->setPath(route('accounts.show', [$account->id, $start->format('Y-m-d'), $end->format('Y-m-d')])); $showAll = false; + Log::debug(sprintf(show: 'Call finalAccountBalance with date/time "%s"', $end->toIso8601String())); $balances = Steam::filterAccountBalance(Steam::finalAccountBalance($account, $end), $account, $this->convertToNative, $accountCurrency); return view( @@ -200,6 +202,7 @@ class ShowController extends Controller $groups->setPath(route('accounts.show.all', [$account->id])); $chartUrl = route('chart.account.period', [$account->id, $start->format('Y-m-d'), $end->format('Y-m-d')]); $showAll = true; + Log::debug(sprintf('showAll: Call finalAccountBalance with date/time "%s"', $end->toIso8601String())); $balances = Steam::filterAccountBalance(Steam::finalAccountBalance($account, $end), $account, $this->convertToNative, $accountCurrency); return view( diff --git a/app/Http/Controllers/Chart/AccountController.php b/app/Http/Controllers/Chart/AccountController.php index 72eaa746e5..17dba32c78 100644 --- a/app/Http/Controllers/Chart/AccountController.php +++ b/app/Http/Controllers/Chart/AccountController.php @@ -453,6 +453,7 @@ class AccountController extends Controller // temp, get end balance. Log::debug('temp get end balance'); + Log::debug(sprintf('period: Call finalAccountBalance with date/time "%s"', $end->toIso8601String())); Steam::finalAccountBalance($account, $end); Log::debug('END temp get end balance done'); diff --git a/app/Http/Controllers/Json/ReconcileController.php b/app/Http/Controllers/Json/ReconcileController.php index 34a9d1ec87..a76842c5d0 100644 --- a/app/Http/Controllers/Json/ReconcileController.php +++ b/app/Http/Controllers/Json/ReconcileController.php @@ -195,6 +195,8 @@ class ReconcileController extends Controller $startDate->subDay(); $currency = $this->accountRepos->getAccountCurrency($account) ?? $this->defaultCurrency; + Log::debug(sprintf('transactions: Call finalAccountBalance with date/time "%s"', $startDate->toIso8601String())); + Log::debug(sprintf('transactions2: Call finalAccountBalance with date/time "%s"', $end->toIso8601String())); $startBalance = Steam::bcround(Steam::finalAccountBalance($account, $startDate)['balance'], $currency->decimal_places); $endBalance = Steam::bcround(Steam::finalAccountBalance($account, $end)['balance'], $currency->decimal_places); diff --git a/app/Http/Controllers/Transaction/ConvertController.php b/app/Http/Controllers/Transaction/ConvertController.php index 5f4c9b9cc0..66b542d3c0 100644 --- a/app/Http/Controllers/Transaction/ConvertController.php +++ b/app/Http/Controllers/Transaction/ConvertController.php @@ -43,6 +43,7 @@ use Illuminate\Contracts\View\Factory; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Routing\Redirector; +use Illuminate\Support\Facades\Log; use Illuminate\View\View; /** @@ -223,7 +224,9 @@ class ConvertController extends Controller // group accounts: /** @var Account $account */ foreach ($accountList as $account) { - $balance = Steam::finalAccountBalance($account, today()->endOfDay())['balance']; + $date = today()->endOfDay(); + Log::debug(sprintf('getLiabilities: Call finalAccountBalance with date/time "%s"', $date->toIso8601String())); + $balance = Steam::finalAccountBalance($account, $date)['balance']; $currency = $this->accountRepository->getAccountCurrency($account) ?? $this->defaultCurrency; $role = 'l_'.$account->accountType->type; $key = (string) trans('firefly.opt_group_'.$role); @@ -245,7 +248,9 @@ class ConvertController extends Controller // group accounts: /** @var Account $account */ foreach ($accountList as $account) { - $balance = Steam::finalAccountBalance($account, today()->endOfDay())['balance']; + $date = today()->endOfDay(); + Log::debug(sprintf('getAssetAccounts: Call finalAccountBalance with date/time "%s"', $date->toIso8601String())); + $balance = Steam::finalAccountBalance($account, $date)['balance']; $currency = $this->accountRepository->getAccountCurrency($account) ?? $this->defaultCurrency; $role = (string) $this->accountRepository->getMetaValue($account, 'account_role'); if ('' === $role) { diff --git a/app/Repositories/PiggyBank/PiggyBankRepository.php b/app/Repositories/PiggyBank/PiggyBankRepository.php index 7f1b1239c0..9291cbdd05 100644 --- a/app/Repositories/PiggyBank/PiggyBankRepository.php +++ b/app/Repositories/PiggyBank/PiggyBankRepository.php @@ -371,6 +371,7 @@ class PiggyBankRepository implements PiggyBankRepositoryInterface public function leftOnAccount(PiggyBank $piggyBank, Account $account, Carbon $date): string { Log::debug(sprintf('leftOnAccount("%s","%s","%s")', $piggyBank->name, $account->name, $date->format('Y-m-d H:i:s'))); + Log::debug(sprintf('leftOnAccount: Call finalAccountBalance with date/time "%s"', $date->toIso8601String())); $balance = Steam::finalAccountBalance($account, $date)['balance']; Log::debug(sprintf('Balance is: %s', $balance)); diff --git a/app/Support/Steam.php b/app/Support/Steam.php index fdfa2a039c..dadd51debe 100644 --- a/app/Support/Steam.php +++ b/app/Support/Steam.php @@ -76,6 +76,7 @@ class Steam $balances = []; $formatted = $start->format('Y-m-d'); + Log::debug(sprintf('finalAccountBalanceInRange: Call finalAccountBalance with date/time "%s"', $start->toIso8601String())); $startBalance = $this->finalAccountBalance($account, $start); $nativeCurrency = app('amount')->getNativeCurrencyByUserGroup($account->user->userGroup); $accountCurrency = $this->getAccountCurrency($account); @@ -164,6 +165,7 @@ class Steam public function finalAccountsBalance(Collection $accounts, Carbon $date): array { + Log::debug(sprintf('finalAccountsBalance: Call finalAccountBalance with date/time "%s"', $date->toIso8601String())); $balances = []; foreach ($accounts as $account) { $balances[$account->id] = $this->finalAccountBalance($account, $date); @@ -260,6 +262,8 @@ class Steam } /** + * Returns smaller than or equal to, so be careful with END OF DAY. + * * Returns the balance of an account at exact moment given. Array with at least one value. * Always returns: * "balance": balance in the account's currency OR user's native currency if the account has no currency @@ -278,7 +282,7 @@ class Steam $cache->addProperty($date); if ($cache->has()) { // Log::debug(sprintf('CACHED finalAccountBalance(#%d, %s)', $account->id, $date->format('Y-m-d H:i:s'))); - // return $cache->get(); + return $cache->get(); } Log::debug(sprintf('finalAccountBalance(#%d, %s)', $account->id, $date->format('Y-m-d H:i:s'))); diff --git a/app/Support/Twig/General.php b/app/Support/Twig/General.php index ae31968f0e..80383ec78f 100644 --- a/app/Support/Twig/General.php +++ b/app/Support/Twig/General.php @@ -31,6 +31,7 @@ use FireflyIII\Repositories\User\UserRepositoryInterface; use FireflyIII\Support\Facades\Amount; use FireflyIII\Support\Facades\Steam; use FireflyIII\Support\Search\OperatorQuerySearch; +use Illuminate\Support\Facades\Log; use League\CommonMark\GithubFlavoredMarkdownConverter; use Route; use Twig\Extension\AbstractExtension; @@ -67,6 +68,7 @@ class General extends AbstractExtension /** @var Carbon $date */ $date = session('end', today(config('app.timezone'))->endOfMonth()); + Log::debug(sprintf('twig balance: Call finalAccountBalance with date/time "%s"', $date->toIso8601String())); $info = Steam::finalAccountBalance($account, $date); $currency = Steam::getAccountCurrency($account); $default = Amount::getNativeCurrency(); diff --git a/app/Transformers/AccountTransformer.php b/app/Transformers/AccountTransformer.php index fac497b58a..07a62bd4c6 100644 --- a/app/Transformers/AccountTransformer.php +++ b/app/Transformers/AccountTransformer.php @@ -31,6 +31,7 @@ use FireflyIII\Models\TransactionCurrency; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Support\Facades\Amount; use FireflyIII\Support\Facades\Steam; +use Illuminate\Support\Facades\Log; use Symfony\Component\HttpFoundation\ParameterBag; /** @@ -106,6 +107,7 @@ class AccountTransformer extends AbstractTransformer $order = null; } // balance, native balance, virtual balance, native virtual balance? + Log::debug(sprintf('transform: Call finalAccountBalance with date/time "%s"', $date->toIso8601String())); $finalBalance = Steam::finalAccountBalance($account, $date); if ($convertToNative) { $finalBalance['balance'] = $finalBalance[$currencyCode] ?? '0';