. */ declare(strict_types=1); namespace FireflyIII\Http\Controllers\Chart; use Carbon\Carbon; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Generator\Chart\Basic\GeneratorInterface; use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Models\TransactionType; use FireflyIII\Support\CacheProperties; use Illuminate\Http\JsonResponse; /** * Class TransactionController */ class TransactionController extends Controller { /** @var GeneratorInterface Chart generation methods. */ protected $generator; /** * TransactionController constructor. */ public function __construct() { parent::__construct(); $this->generator = app(GeneratorInterface::class); } /** * @param Carbon $start * @param Carbon $end * * @return JsonResponse * @throws \JsonException */ public function budgets(Carbon $start, Carbon $end) { $cache = new CacheProperties; $cache->addProperty($start); $cache->addProperty($end); $cache->addProperty('chart.transactions.budgets'); if ($cache->has()) { return response()->json($cache->get()); } /** @var GroupCollectorInterface $collector */ $collector = app(GroupCollectorInterface::class); $collector->setRange($start, $end); $collector->withBudgetInformation(); $collector->setTypes([TransactionType::WITHDRAWAL]); $result = $collector->getExtractedJournals(); $data = []; // group by category. /** @var array $journal */ foreach ($result as $journal) { $budget = $journal['budget_name'] ?? (string)trans('firefly.no_budget'); $title = sprintf('%s (%s)', $budget, $journal['currency_symbol']); $data[$title] = $data[$title] ?? [ 'amount' => '0', 'currency_symbol' => $journal['currency_symbol'], 'currency_code' => $journal['currency_code'], ]; $data[$title]['amount'] = bcadd($data[$title]['amount'], $journal['amount']); } $chart = $this->generator->multiCurrencyPieChart($data); $cache->store($chart); return response()->json($chart); } /** * @param string $objectType * @param Carbon $start * @param Carbon $end * * @return JsonResponse * @throws FireflyException * @throws \JsonException */ public function categories(string $objectType, Carbon $start, Carbon $end) { $cache = new CacheProperties; $cache->addProperty($start); $cache->addProperty($end); $cache->addProperty($objectType); $cache->addProperty('chart.transactions.categories'); if ($cache->has()) { return response()->json($cache->get()); } /** @var GroupCollectorInterface $collector */ $collector = app(GroupCollectorInterface::class); $collector->setRange($start, $end); $collector->withCategoryInformation(); switch ($objectType) { default: throw new FireflyException(sprintf('Cant handle "%s"', $objectType)); case 'withdrawal': $collector->setTypes([TransactionType::WITHDRAWAL]); break; case 'deposit': $collector->setTypes([TransactionType::DEPOSIT]); break; case 'transfers': case 'transfer': $collector->setTypes([TransactionType::TRANSFER]); break; } $result = $collector->getExtractedJournals(); $data = []; // group by category. /** @var array $journal */ foreach ($result as $journal) { $category = $journal['category_name'] ?? (string)trans('firefly.no_category'); $title = sprintf('%s (%s)', $category, $journal['currency_symbol']); $data[$title] = $data[$title] ?? [ 'amount' => '0', 'currency_symbol' => $journal['currency_symbol'], 'currency_code' => $journal['currency_code'], ]; $data[$title]['amount'] = bcadd($data[$title]['amount'], $journal['amount']); } $chart = $this->generator->multiCurrencyPieChart($data); $cache->store($chart); return response()->json($chart); } /** * @param string $objectType * @param Carbon $start * @param Carbon $end * * @return JsonResponse * @throws FireflyException * @throws \JsonException */ public function destinationAccounts(string $objectType, Carbon $start, Carbon $end) { $cache = new CacheProperties; $cache->addProperty($start); $cache->addProperty($end); $cache->addProperty($objectType); $cache->addProperty('chart.transactions.destinations'); if ($cache->has()) { return response()->json($cache->get()); } /** @var GroupCollectorInterface $collector */ $collector = app(GroupCollectorInterface::class); $collector->setRange($start, $end); $collector->withAccountInformation(); switch ($objectType) { default: throw new FireflyException(sprintf('Cant handle "%s"', $objectType)); case 'withdrawal': $collector->setTypes([TransactionType::WITHDRAWAL]); break; case 'deposit': $collector->setTypes([TransactionType::DEPOSIT]); break; case 'transfers': case 'transfer': $collector->setTypes([TransactionType::TRANSFER]); break; } $result = $collector->getExtractedJournals(); $data = []; // group by category. /** @var array $journal */ foreach ($result as $journal) { $name = $journal['destination_account_name']; $title = sprintf('%s (%s)', $name, $journal['currency_symbol']); $data[$title] = $data[$title] ?? [ 'amount' => '0', 'currency_symbol' => $journal['currency_symbol'], 'currency_code' => $journal['currency_code'], ]; $data[$title]['amount'] = bcadd($data[$title]['amount'], $journal['amount']); } $chart = $this->generator->multiCurrencyPieChart($data); $cache->store($chart); return response()->json($chart); } /** * @param string $objectType * @param Carbon $start * @param Carbon $end * * @return JsonResponse * @throws FireflyException * @throws \JsonException */ public function sourceAccounts(string $objectType, Carbon $start, Carbon $end) { $cache = new CacheProperties; $cache->addProperty($start); $cache->addProperty($end); $cache->addProperty($objectType); $cache->addProperty('chart.transactions.sources'); if ($cache->has()) { return response()->json($cache->get()); } /** @var GroupCollectorInterface $collector */ $collector = app(GroupCollectorInterface::class); $collector->setRange($start, $end); $collector->withAccountInformation(); switch ($objectType) { default: throw new FireflyException(sprintf('Cant handle "%s"', $objectType)); case 'withdrawal': $collector->setTypes([TransactionType::WITHDRAWAL]); break; case 'deposit': $collector->setTypes([TransactionType::DEPOSIT]); break; case 'transfers': case 'transfer': $collector->setTypes([TransactionType::TRANSFER]); break; } $result = $collector->getExtractedJournals(); $data = []; // group by category. /** @var array $journal */ foreach ($result as $journal) { $name = $journal['source_account_name']; $title = sprintf('%s (%s)', $name, $journal['currency_symbol']); $data[$title] = $data[$title] ?? [ 'amount' => '0', 'currency_symbol' => $journal['currency_symbol'], 'currency_code' => $journal['currency_code'], ]; $data[$title]['amount'] = bcadd($data[$title]['amount'], $journal['amount']); } $chart = $this->generator->multiCurrencyPieChart($data); $cache->store($chart); return response()->json($chart); } }