diff --git a/app/Http/Controllers/Chart/PiggyBankController.php b/app/Http/Controllers/Chart/PiggyBankController.php index 37beb074ce..791c5f3b9d 100644 --- a/app/Http/Controllers/Chart/PiggyBankController.php +++ b/app/Http/Controllers/Chart/PiggyBankController.php @@ -22,12 +22,14 @@ declare(strict_types=1); namespace FireflyIII\Http\Controllers\Chart; +use Carbon\Carbon; use FireflyIII\Generator\Chart\Basic\GeneratorInterface; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Models\PiggyBank; use FireflyIII\Models\PiggyBankEvent; use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; use FireflyIII\Support\CacheProperties; +use Illuminate\Support\Collection; /** * Class PiggyBankController. @@ -64,16 +66,44 @@ class PiggyBankController extends Controller if ($cache->has()) { return response()->json($cache->get()); // @codeCoverageIgnore } + $set = $repository->getEvents($piggyBank); + $set = $set->reverse(); + + // get first event or start date of piggy bank or today + $startDate = $piggyBank->start_date ?? new Carbon; + + /** @var PiggyBankEvent $first */ + $firstEvent = $set->first(); + $firstDate = null === $firstEvent ? new Carbon : $firstEvent->date; + + // which ever is older: + $oldest = $startDate->lt($firstDate) ? $startDate : $firstDate; + $today = new Carbon; + // depending on diff, do something with range of chart. + $step = '1D'; + $months = $oldest->diffInMonths($today); + if ($months > 3) { + $step = '1W'; // @codeCoverageIgnore + } + if ($months > 24) { + $step = '1M'; // @codeCoverageIgnore + } + if ($months > 100) { + $step = '1Y'; // @codeCoverageIgnore + } - $set = $repository->getEvents($piggyBank); - $set = $set->reverse(); $chartData = []; - $sum = '0'; - /** @var PiggyBankEvent $entry */ - foreach ($set as $entry) { - $label = $entry->date->formatLocalized((string)trans('config.month_and_day')); - $sum = bcadd($sum, $entry->amount); - $chartData[$label] = $sum; + while ($oldest <= $today) { + /** @var Collection $filtered */ + $filtered = $set->filter( + function (PiggyBankEvent $event) use ($oldest) { + return $event->date->lte($oldest); + } + ); + $currentSum = $filtered->sum('amount'); + $label = $oldest->formatLocalized((string)trans('config.month_and_day')); + $chartData[$label] = $currentSum; + $oldest = app('navigation')->addPeriod($oldest, $step, 0); } $data = $this->generator->singleSet($piggyBank->name, $chartData);