. */ declare(strict_types=1); namespace FireflyIII\Repositories\Account; use Carbon\Carbon; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Models\TransactionType; use FireflyIII\User; use Illuminate\Support\Collection; use Log; /** * * Class OperationsRepository */ class OperationsRepository implements OperationsRepositoryInterface { /** @var User */ private $user; /** * Constructor. */ public function __construct() { if ('testing' === config('app.env')) { Log::warning(sprintf('%s should not be instantiated in the TEST environment!', get_class($this))); die(__METHOD__); } } /** * This method returns a list of all the withdrawal transaction journals (as arrays) set in that period * which have the specified accounts. It's grouped per currency, with as few details in the array * as possible. Amounts are always negative. * * @param Carbon $start * @param Carbon $end * @param Collection $accounts * * @return array */ public function listExpenses(Carbon $start, Carbon $end, Collection $accounts): array { /** @var GroupCollectorInterface $collector */ $collector = app(GroupCollectorInterface::class); $collector->setUser($this->user)->setRange($start, $end)->setTypes([TransactionType::WITHDRAWAL]); $collector->setBothAccounts($accounts); $collector->withCategoryInformation()->withAccountInformation()->withBudgetInformation()->withTagInformation(); $journals = $collector->getExtractedJournals(); $array = []; foreach ($journals as $journal) { $currencyId = (int)$journal['currency_id']; $array[$currencyId] = $array[$currencyId] ?? [ 'currency_id' => $currencyId, 'currency_name' => $journal['currency_name'], 'currency_symbol' => $journal['currency_symbol'], 'currency_code' => $journal['currency_code'], 'currency_decimal_places' => $journal['currency_decimal_places'], 'transaction_journals' => [], ]; $journalId = (int)$journal['transaction_journal_id']; $array[$currencyId]['transaction_journals'][$journalId] = [ 'amount' => app('steam')->negative($journal['amount']), 'date' => $journal['date'], 'transaction_journal_id' => $journalId, 'budget_name' => $journal['budget_name'], 'category_name' => $journal['category_name'], 'source_account_id' => $journal['source_account_id'], 'source_account_name' => $journal['source_account_name'], 'source_account_iban' => $journal['source_account_iban'], 'destination_account_id' => $journal['destination_account_id'], 'destination_account_name' => $journal['destination_account_name'], 'destination_account_iban' => $journal['destination_account_iban'], 'tags' => $journal['tags'], 'description' => $journal['description'], 'transaction_group_id' => $journal['transaction_group_id'], ]; } return $array; } /** * This method returns a list of all the deposit transaction journals (as arrays) set in that period * which have the specified accounts. It's grouped per currency, with as few details in the array * as possible. Amounts are always positive. * * @param Carbon $start * @param Carbon $end * @param Collection|null $accounts * * @return array */ public function listIncome(Carbon $start, Carbon $end, ?Collection $accounts = null): array { /** @var GroupCollectorInterface $collector */ $collector = app(GroupCollectorInterface::class); $collector->setUser($this->user)->setRange($start, $end)->setTypes([TransactionType::DEPOSIT]); $collector->setBothAccounts($accounts); $collector->withCategoryInformation()->withAccountInformation()->withBudgetInformation()->withTagInformation(); $journals = $collector->getExtractedJournals(); $array = []; foreach ($journals as $journal) { $currencyId = (int)$journal['currency_id']; $array[$currencyId] = $array[$currencyId] ?? [ 'currency_id' => $currencyId, 'currency_name' => $journal['currency_name'], 'currency_symbol' => $journal['currency_symbol'], 'currency_code' => $journal['currency_code'], 'currency_decimal_places' => $journal['currency_decimal_places'], 'transaction_journals' => [], ]; $journalId = (int)$journal['transaction_journal_id']; $array[$currencyId]['transaction_journals'][$journalId] = [ 'amount' => app('steam')->positive($journal['amount']), 'date' => $journal['date'], 'transaction_journal_id' => $journalId, 'budget_name' => $journal['budget_name'], 'tags' => $journal['tags'], 'category_name' => $journal['category_name'], 'source_account_id' => $journal['source_account_id'], 'source_account_name' => $journal['source_account_name'], 'source_account_iban' => $journal['source_account_iban'], 'destination_account_id' => $journal['destination_account_id'], 'destination_account_name' => $journal['destination_account_name'], 'destination_account_iban' => $journal['destination_account_iban'], 'description' => $journal['description'], 'transaction_group_id' => $journal['transaction_group_id'], ]; } return $array; } /** * @param User $user */ public function setUser(User $user): void { $this->user = $user; } /** * Sum of withdrawal journals in period for a set of accounts, grouped per currency. Amounts are always negative. * * @param Carbon $start * @param Carbon $end * @param Collection|null $accounts * * @return array */ public function sumExpenses(Carbon $start, Carbon $end, ?Collection $accounts = null): array { throw new FireflyException(sprintf('%s is not yet implemented', __METHOD__)); } /** * Sum of income journals in period for a set of accounts, grouped per currency. Amounts are always positive. * * @param Carbon $start * @param Carbon $end * @param Collection|null $accounts * * @return array */ public function sumIncome(Carbon $start, Carbon $end, ?Collection $accounts = null): array { throw new FireflyException(sprintf('%s is not yet implemented', __METHOD__)); } }