From f2c1dd41d06e2d5c1b808ea2304001d3ae05b12b Mon Sep 17 00:00:00 2001 From: James Cole Date: Wed, 2 Mar 2016 12:25:00 +0100 Subject: [PATCH] Expanded Amount and expanded TransactionJournal to include source and destination information. --- app/Models/TransactionJournal.php | 43 +++++++++++++++++++++++++++++-- app/Support/Amount.php | 38 +++++++++++++-------------- 2 files changed, 59 insertions(+), 22 deletions(-) diff --git a/app/Models/TransactionJournal.php b/app/Models/TransactionJournal.php index baabbd01b2..0b5ca3ea8d 100644 --- a/app/Models/TransactionJournal.php +++ b/app/Models/TransactionJournal.php @@ -7,6 +7,7 @@ use Illuminate\Database\Eloquent\Builder as EloquentBuilder; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\SoftDeletes; +use Illuminate\Database\Query\JoinClause; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Watson\Validating\ValidatingTrait; @@ -56,7 +57,19 @@ class TransactionJournal extends Model const QUERYFIELDS = [ 'transaction_journals.*', - 'transaction_types.type as transaction_type_type', // the other field is called "transaction_type_id" so this is pretty consistent. + 'transaction_types.type AS transaction_type_type', // the other field is called "transaction_type_id" so this is pretty consistent. + 'transaction_currencies.code AS transaction_currency_code', + // all for destination: + 'destination.amount AS destination_amount', + 'destination_account.id AS destination_account_id', + 'destination_account.name AS destination_account_name', + 'destination_acct_type.type AS destination_account_type', + // all for source: + 'source.amount AS source_amount', + 'source_account.id AS source_account_id', + 'source_account.name AS source_account_name', + 'source_acct_type.type AS source_account_type', + ]; /** @var array */ protected $dates = ['created_at', 'updated_at', 'date', 'deleted_at', 'interest_date', 'book_date']; @@ -279,7 +292,33 @@ class TransactionJournal extends Model // left join transaction type: $query->leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id'); - // try to get amount + // left join transaction currency: + $query->leftJoin('transaction_currencies', 'transaction_currencies.id', '=', 'transaction_journals.transaction_currency_id'); + + // left join destination (for amount and account info). + $query->leftJoin( + 'transactions as destination', function (JoinClause $join) { + $join->on('destination.transaction_journal_id', '=', 'transaction_journals.id') + ->where('destination.amount', '>', 0); + } + ); + // join destination account + $query->leftJoin('accounts as destination_account', 'destination_account.id', '=', 'destination.account_id'); + // join destination account type + $query->leftJoin('account_types as destination_acct_type', 'destination_account.account_type_id', '=', 'destination_acct_type.id'); + + // left join source (for amount and account info). + $query->leftJoin( + 'transactions as source', function (JoinClause $join) { + $join->on('source.transaction_journal_id', '=', 'transaction_journals.id') + ->where('source.amount', '<', 0); + } + ); + // join destination account + $query->leftJoin('accounts as source_account', 'source_account.id', '=', 'source.account_id'); + // join destination account type + $query->leftJoin('account_types as source_acct_type', 'source_account.account_type_id', '=', 'source_acct_type.id'); + } diff --git a/app/Support/Amount.php b/app/Support/Amount.php index 49f5f6d0cc..ad4b63b61e 100644 --- a/app/Support/Amount.php +++ b/app/Support/Amount.php @@ -70,31 +70,29 @@ class Amount */ public function formatJournal(TransactionJournal $journal, bool $coloured = true): string { - $cache = new CacheProperties; - $cache->addProperty($journal->id); - $cache->addProperty('formatJournal'); - - if ($cache->has()) { - return $cache->get(); // @codeCoverageIgnore + $locale = setlocale(LC_MONETARY, 0); + $float = floatval($journal->destination_amount); + if ($journal->isWithdrawal()) { + $float = floatval($journal->source_amount); } + $formatter = new NumberFormatter($locale, NumberFormatter::CURRENCY); + $result = $formatter->formatCurrency($float, $journal->transaction_currency_code); - if ($journal->isTransfer() && $coloured) { - $txt = '' . $this->formatAnything($journal->transactionCurrency, $journal->amount_positive, false) . ''; - $cache->store($txt); - - return $txt; + if ($coloured === true && $float == 0) { + return '' . $result . ''; // always grey. } - if ($journal->isTransfer() && !$coloured) { - $txt = $this->formatAnything($journal->transactionCurrency, $journal->amount_positive, false); - $cache->store($txt); - - return $txt; + if (!$coloured) { + return $result; } + if (!$journal->isTransfer()) { + if ($float > 0) { + return '' . $result . ''; + } - $txt = $this->formatAnything($journal->transactionCurrency, $journal->amount, $coloured); - $cache->store($txt); - - return $txt; + return '' . $result . ''; + } else { + return '' . $result . ''; + } } /**