Expand test coverage and improve transaction management code.

This commit is contained in:
James Cole
2019-07-01 20:22:35 +02:00
parent 94acb50a6f
commit 5bbe1eab7c
63 changed files with 1251 additions and 812 deletions

View File

@@ -647,9 +647,13 @@ class BudgetRepository implements BudgetRepositoryInterface
*/
public function searchBudget(string $query): Collection
{
$query = sprintf('%%%s%%', $query);
return $this->user->budgets()->where('name', 'LIKE', $query)->get();
$search = $this->user->budgets();
if ('' !== $query) {
$search->where('name', 'LIKE', sprintf('%%%s%%', $query));
}
return $search->get();
}
/**

View File

@@ -111,22 +111,6 @@ class CategoryRepository implements CategoryRepositoryInterface
return $collector->getExtractedJournals();
}
/**
* @param array $journals
* @return string
*/
private function sumJournals(array $journals): string
{
$sum = '0';
/** @var array $journal */
foreach ($journals as $journal) {
$amount = (string)$journal['amount'];
$sum = bcadd($sum, $amount);
}
return $sum;
}
/**
* A very cryptic method name that means:
*
@@ -156,7 +140,7 @@ class CategoryRepository implements CategoryRepositoryInterface
$currencyId = (int)$journal['currency_id'];
if (!isset($return[$currencyId])) {
$return[$currencyId] = [
'earned' => '0',
'earned' => '0',
'currency_id' => $currencyId,
'currency_symbol' => $journal['currency_symbol'],
'currency_code' => $journal['currency_code'],
@@ -264,8 +248,6 @@ class CategoryRepository implements CategoryRepositoryInterface
return $result;
}
/** @noinspection MoreThanThreeArgumentsInspection */
/**
* Find a category or return NULL
*
@@ -278,6 +260,8 @@ class CategoryRepository implements CategoryRepositoryInterface
return $this->user->categories()->find($categoryId);
}
/** @noinspection MoreThanThreeArgumentsInspection */
/**
* Find a category.
*
@@ -297,8 +281,6 @@ class CategoryRepository implements CategoryRepositoryInterface
return null;
}
/** @noinspection MoreThanThreeArgumentsInspection */
/**
* @param array $data
*
@@ -313,6 +295,8 @@ class CategoryRepository implements CategoryRepositoryInterface
return $factory->findOrCreate(null, $data['name']);
}
/** @noinspection MoreThanThreeArgumentsInspection */
/**
* @param Category $category
*
@@ -341,47 +325,6 @@ class CategoryRepository implements CategoryRepositoryInterface
return $firstJournalDate;
}
/**
* @param Category $category
*
* @return Carbon|null
*/
private function getFirstJournalDate(Category $category): ?Carbon
{
$query = $category->transactionJournals()->orderBy('date', 'ASC');
$result = $query->first(['transaction_journals.*']);
if (null !== $result) {
return $result->date;
}
return null;
}
/** @noinspection MoreThanThreeArgumentsInspection */
/**
* @param Category $category
*
* @return Carbon|null
*/
private function getFirstTransactionDate(Category $category): ?Carbon
{
// check transactions:
$query = $category->transactions()
->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id')
->orderBy('transaction_journals.date', 'ASC');
$lastTransaction = $query->first(['transaction_journals.*']);
if (null !== $lastTransaction) {
return new Carbon($lastTransaction->date);
}
return null;
}
/** @noinspection MoreThanThreeArgumentsInspection */
/**
* Get all categories with ID's.
*
@@ -394,8 +337,6 @@ class CategoryRepository implements CategoryRepositoryInterface
return $this->user->categories()->whereIn('id', $categoryIds)->get();
}
/** @noinspection MoreThanThreeArgumentsInspection */
/**
* @param Category $category
* @param Collection $accounts
@@ -426,55 +367,7 @@ class CategoryRepository implements CategoryRepositoryInterface
return $lastJournalDate;
}
/**
* @param Category $category
* @param Collection $accounts
*
* @return Carbon|null
*/
private function getLastJournalDate(Category $category, Collection $accounts): ?Carbon
{
$query = $category->transactionJournals()->orderBy('date', 'DESC');
if ($accounts->count() > 0) {
$query->leftJoin('transactions as t', 't.transaction_journal_id', '=', 'transaction_journals.id');
$query->whereIn('t.account_id', $accounts->pluck('id')->toArray());
}
$result = $query->first(['transaction_journals.*']);
if (null !== $result) {
return $result->date;
}
return null;
}
/**
* @param Category $category
* @param Collection $accounts
*
* @return Carbon|null
* @throws \Exception
*/
private function getLastTransactionDate(Category $category, Collection $accounts): ?Carbon
{
// check transactions:
$query = $category->transactions()
->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id')
->orderBy('transaction_journals.date', 'DESC');
if ($accounts->count() > 0) {
// filter journals:
$query->whereIn('transactions.account_id', $accounts->pluck('id')->toArray());
}
$lastTransaction = $query->first(['transaction_journals.*']);
if (null !== $lastTransaction) {
return new Carbon($lastTransaction->date);
}
return null;
}
/** @noinspection MoreThanThreeArgumentsInspection */
/**
* @param Collection $categories
@@ -518,6 +411,8 @@ class CategoryRepository implements CategoryRepositoryInterface
return $data;
}
/** @noinspection MoreThanThreeArgumentsInspection */
/**
* @param Collection $accounts
* @param Carbon $start
@@ -555,6 +450,8 @@ class CategoryRepository implements CategoryRepositoryInterface
return $result;
}
/** @noinspection MoreThanThreeArgumentsInspection */
/**
* @param Collection $categories
* @param Collection $accounts
@@ -644,9 +541,12 @@ class CategoryRepository implements CategoryRepositoryInterface
*/
public function searchCategory(string $query): Collection
{
$query = sprintf('%%%s%%', $query);
$search = $this->user->categories();
if ('' !== $query) {
$search->where('name', 'LIKE', sprintf('%%%s%%', $query));
}
return $this->user->categories()->where('name', 'LIKE', $query)->get();
return $search->get();
}
/**
@@ -831,4 +731,107 @@ class CategoryRepository implements CategoryRepositoryInterface
return $service->update($category, $data);
}
/**
* @param array $journals
* @return string
*/
private function sumJournals(array $journals): string
{
$sum = '0';
/** @var array $journal */
foreach ($journals as $journal) {
$amount = (string)$journal['amount'];
$sum = bcadd($sum, $amount);
}
return $sum;
}
/**
* @param Category $category
*
* @return Carbon|null
*/
private function getFirstJournalDate(Category $category): ?Carbon
{
$query = $category->transactionJournals()->orderBy('date', 'ASC');
$result = $query->first(['transaction_journals.*']);
if (null !== $result) {
return $result->date;
}
return null;
}
/**
* @param Category $category
*
* @return Carbon|null
*/
private function getFirstTransactionDate(Category $category): ?Carbon
{
// check transactions:
$query = $category->transactions()
->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id')
->orderBy('transaction_journals.date', 'ASC');
$lastTransaction = $query->first(['transaction_journals.*']);
if (null !== $lastTransaction) {
return new Carbon($lastTransaction->date);
}
return null;
}
/**
* @param Category $category
* @param Collection $accounts
*
* @return Carbon|null
*/
private function getLastJournalDate(Category $category, Collection $accounts): ?Carbon
{
$query = $category->transactionJournals()->orderBy('date', 'DESC');
if ($accounts->count() > 0) {
$query->leftJoin('transactions as t', 't.transaction_journal_id', '=', 'transaction_journals.id');
$query->whereIn('t.account_id', $accounts->pluck('id')->toArray());
}
$result = $query->first(['transaction_journals.*']);
if (null !== $result) {
return $result->date;
}
return null;
}
/**
* @param Category $category
* @param Collection $accounts
*
* @return Carbon|null
* @throws \Exception
*/
private function getLastTransactionDate(Category $category, Collection $accounts): ?Carbon
{
// check transactions:
$query = $category->transactions()
->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id')
->orderBy('transaction_journals.date', 'DESC');
if ($accounts->count() > 0) {
// filter journals:
$query->whereIn('transactions.account_id', $accounts->pluck('id')->toArray());
}
$lastTransaction = $query->first(['transaction_journals.*']);
if (null !== $lastTransaction) {
return new Carbon($lastTransaction->date);
}
return null;
}
}

View File

@@ -258,7 +258,7 @@ class CurrencyRepository implements CurrencyRepositoryInterface
/**
* Find by object, ID or code. Returns user default or system default.
*
* @param int|null $currencyId
* @param int|null $currencyId
* @param string|null $currencyCode
*
* @return TransactionCurrency|null
@@ -288,7 +288,7 @@ class CurrencyRepository implements CurrencyRepositoryInterface
/**
* Find by object, ID or code. Returns NULL if nothing found.
*
* @param int|null $currencyId
* @param int|null $currencyId
* @param string|null $currencyCode
*
* @return TransactionCurrency|null
@@ -369,7 +369,7 @@ class CurrencyRepository implements CurrencyRepositoryInterface
*
* @param TransactionCurrency $fromCurrency
* @param TransactionCurrency $toCurrency
* @param Carbon $date
* @param Carbon $date
*
* @return CurrencyExchangeRate|null
*/
@@ -438,7 +438,7 @@ class CurrencyRepository implements CurrencyRepositoryInterface
/**
* @param TransactionCurrency $currency
* @param array $data
* @param array $data
*
* @return TransactionCurrency
*/
@@ -449,4 +449,18 @@ class CurrencyRepository implements CurrencyRepositoryInterface
return $service->update($currency, $data);
}
/**
* @param string $search
* @return Collection
*/
public function searchCurrency(string $search): Collection
{
$query = TransactionCurrency::where('enabled', 1);
if ('' !== $search) {
$query->where('name', 'LIKE', sprintf('%%%s%%', $search));
}
return $query->get();
}
}

View File

@@ -34,6 +34,12 @@ use Illuminate\Support\Collection;
*/
interface CurrencyRepositoryInterface
{
/**
* @param string $search
* @return Collection
*/
public function searchCurrency(string $search): Collection;
/**
* @param TransactionCurrency $currency
*

View File

@@ -54,6 +54,8 @@ use stdClass;
*/
class JournalRepository implements JournalRepositoryInterface
{
/** @var User */
private $user;
@@ -67,7 +69,25 @@ class JournalRepository implements JournalRepositoryInterface
}
}
/**
* Search in journal descriptions.
*
* @param string $search
* @return Collection
*/
public function searchJournalDescriptions(string $search): Collection
{
$query = $this->user->transactionJournals()
->orderBy('date', 'DESC');
if ('' !== $query) {
$query->where('description', 'LIKE', sprintf('%%%s%%', $search));
}
return $query->get();
}
/** @noinspection MoreThanThreeArgumentsInspection */
/**
* @param TransactionJournal $journal
* @param TransactionType $type

View File

@@ -41,6 +41,14 @@ use Illuminate\Support\MessageBag;
interface JournalRepositoryInterface
{
/**
* Search in journal descriptions.
*
* @param string $search
* @return Collection
*/
public function searchJournalDescriptions(string $search): Collection;
/**
* Get all transaction journals with a specific type, regardless of user.
*

View File

@@ -303,13 +303,11 @@ class RecurringRepository implements RecurringRepositoryInterface
}
/**
* TODO check usage and verify it still works.
*
* @param Recurrence $recurrence
*
* @return Collection
*/
public function getTransactions(Recurrence $recurrence): array
public function getTransactions(Recurrence $recurrence): Collection
{
$journalMeta = TransactionJournalMeta
::leftJoin('transaction_journals', 'transaction_journals.id', '=', 'journal_meta.transaction_journal_id')
@@ -319,9 +317,17 @@ class RecurringRepository implements RecurringRepositoryInterface
->where('data', json_encode((string)$recurrence->id))
->get()->pluck('transaction_journal_id')->toArray();
$search = [];
foreach ($journalMeta as $journalId) {
$search[] = (int)$journalId;
}
if (0 === count($search)) {
return [];
}
/** @var GroupCollectorInterface $collector */
$collector = app(GroupCollectorInterface::class);
@@ -330,7 +336,7 @@ class RecurringRepository implements RecurringRepositoryInterface
// filter on specific journals.
$collector->setJournalIds($search);
return $collector->getExtractedJournals();
return $collector->getGroups();
}
/**

View File

@@ -141,9 +141,9 @@ interface RecurringRepositoryInterface
/**
* @param Recurrence $recurrence
*
* @return array
* @return Collection
*/
public function getTransactions(Recurrence $recurrence): array;
public function getTransactions(Recurrence $recurrence): Collection;
/**
* Calculate the next X iterations starting on the date given in $date.

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Repositories\TransactionType;
use FireflyIII\Models\TransactionType;
use Illuminate\Support\Collection;
use Log;
/**
@@ -46,7 +47,7 @@ class TransactionTypeRepository implements TransactionTypeRepositoryInterface
/**
* @param TransactionType|null $type
* @param string|null $typeString
* @param string|null $typeString
*
* @return TransactionType
*/
@@ -67,4 +68,17 @@ class TransactionTypeRepository implements TransactionTypeRepositoryInterface
return $search;
}
/**
* @param string $query
* @return Collection
*/
public function searchTypes(string $query): Collection
{
if ('' === $query) {
return TransactionType::get();
}
return TransactionType::where('type', 'LIKE', sprintf('%%%s%%', $query))->get();
}
}

View File

@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace FireflyIII\Repositories\TransactionType;
use FireflyIII\Models\TransactionType;
use Illuminate\Support\Collection;
/**
* Interface TransactionTypeRepositoryInterface
@@ -44,4 +45,10 @@ interface TransactionTypeRepositoryInterface
* @return TransactionType|null
*/
public function findByType(string $type): ?TransactionType;
/**
* @param string $query
* @return Collection
*/
public function searchTypes(string $query): Collection;
}