diff --git a/app/Export/Entry/EntryAccount.php b/app/Export/Entry/EntryAccount.php index 256d33ecc6..337a7b7a5c 100644 --- a/app/Export/Entry/EntryAccount.php +++ b/app/Export/Entry/EntryAccount.php @@ -24,7 +24,7 @@ class EntryAccount public $iban; /** @var string */ public $name; - /** @var int */ + /** @var string */ public $number; /** @var string */ public $type; diff --git a/app/Export/Entry/EntryBill.php b/app/Export/Entry/EntryBill.php index c5543c4227..c72be96b64 100644 --- a/app/Export/Entry/EntryBill.php +++ b/app/Export/Entry/EntryBill.php @@ -18,7 +18,7 @@ use FireflyIII\Models\Bill; */ class EntryBill { - /** @var string */ + /** @var int */ public $billId = ''; /** @var string */ public $name = ''; diff --git a/app/Export/Entry/EntryBudget.php b/app/Export/Entry/EntryBudget.php index 5d85358da7..00c396db9e 100644 --- a/app/Export/Entry/EntryBudget.php +++ b/app/Export/Entry/EntryBudget.php @@ -18,7 +18,7 @@ use FireflyIII\Models\Budget; */ class EntryBudget { - /** @var string */ + /** @var int */ public $budgetId = ''; /** @var string */ public $name = ''; diff --git a/app/Export/Entry/EntryCategory.php b/app/Export/Entry/EntryCategory.php index 7fbb9834d5..d3896ed954 100644 --- a/app/Export/Entry/EntryCategory.php +++ b/app/Export/Entry/EntryCategory.php @@ -18,7 +18,7 @@ use FireflyIII\Models\Category; */ class EntryCategory { - /** @var string */ + /** @var int */ public $categoryId = ''; /** @var string */ public $name = ''; diff --git a/app/Helpers/Report/ReportHelper.php b/app/Helpers/Report/ReportHelper.php index c551eef6cf..78f01bb4e1 100644 --- a/app/Helpers/Report/ReportHelper.php +++ b/app/Helpers/Report/ReportHelper.php @@ -166,8 +166,7 @@ class ReportHelper implements ReportHelperInterface $object = new Income; /** @var AccountRepositoryInterface $repos */ $repos = app(AccountRepositoryInterface::class); - $types = [TransactionType::DEPOSIT, TransactionType::TRANSFER]; - $journals = $repos->journalsInPeriod($accounts, $types, $start, $end); + $journals = $repos->incomesInPeriod($accounts, $start, $end); foreach ($journals as $entry) { $amount = TransactionJournal::amount($entry); diff --git a/app/Models/LimitRepetition.php b/app/Models/LimitRepetition.php index 590e32fca5..5a1574536b 100644 --- a/app/Models/LimitRepetition.php +++ b/app/Models/LimitRepetition.php @@ -18,6 +18,7 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; * @property float $amount * @property-read BudgetLimit $budgetLimit * @property int $budget_id + * @property string $spent * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\LimitRepetition whereId($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\LimitRepetition whereCreatedAt($value) * @method static \Illuminate\Database\Query\Builder|\FireflyIII\Models\LimitRepetition whereUpdatedAt($value) diff --git a/app/Repositories/Account/AccountRepository.php b/app/Repositories/Account/AccountRepository.php index dbb25391d7..f11285e38c 100644 --- a/app/Repositories/Account/AccountRepository.php +++ b/app/Repositories/Account/AccountRepository.php @@ -300,6 +300,44 @@ class AccountRepository implements AccountRepositoryInterface return $accounts; } + /** + * This method will call AccountRepositoryInterface::journalsInPeriod and get all deposits made by the given $accounts, + * as well as the transfers that move away from those $accounts. This is a slightly sharper selection + * than made by journalsInPeriod itself. + * + * @param Collection $accounts + * @param Carbon $start + * @param Carbon $end + * + * @see AccountRepositoryInterface::journalsInPeriod + * + * @return Collection + */ + public function incomesInPeriod(Collection $accounts, Carbon $start, Carbon $end): Collection + { + $types = [TransactionType::DEPOSIT, TransactionType::TRANSFER]; + $journals = $this->journalsInPeriod($accounts, $types, $start, $end); + $accountIds = $accounts->pluck('id')->toArray(); + + // filter because some of these journals are + $journals = $journals->filter( + function (TransactionJournal $journal) use ($accountIds) { + if ($journal->transaction_type_type == TransactionType::DEPOSIT) { + return $journal; + } + /* + * The destination of a transfer must be one of the $accounts in order to + * be included. Otherwise, it would not be income. + */ + if (in_array($journal->destination_account_id, $accountIds)) { + return $journal; + } + } + ); + + return $journals; + } + /** * @param Collection $accounts * @param array $types @@ -337,7 +375,10 @@ class AccountRepository implements AccountRepositoryInterface } // that should do it: - $complete = $query->get(TransactionJournal::queryFields()); + $fields = TransactionJournal::queryFields(); + $fields[] = 'source.account_id as source_account_id'; + $fields[] = 'destination.account_id as destination_account_id'; + $complete = $query->get($fields); return $complete; } diff --git a/app/Repositories/Account/AccountRepositoryInterface.php b/app/Repositories/Account/AccountRepositoryInterface.php index 4949bed888..1d5039ff3c 100644 --- a/app/Repositories/Account/AccountRepositoryInterface.php +++ b/app/Repositories/Account/AccountRepositoryInterface.php @@ -8,7 +8,6 @@ use FireflyIII\Models\Account; use FireflyIII\Models\AccountMeta; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; -use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Collection; /** @@ -108,6 +107,21 @@ interface AccountRepositoryInterface */ public function getSavingsAccounts(Carbon $start, Carbon $end): Collection; + /** + * This method will call AccountRepositoryInterface::journalsInPeriod and get all deposits made by the given $accounts, + * as well as the transfers that move away from those $accounts. This is a slightly sharper selection + * than made by journalsInPeriod itself. + * + * @param Collection $accounts + * @param Carbon $start + * @param Carbon $end + * + * @see AccountRepositoryInterface::journalsInPeriod + * + * @return Collection + */ + public function incomesInPeriod(Collection $accounts, Carbon $start, Carbon $end): Collection; + /** * @param Collection $accounts * @param array $types