From de56c18c6e68f061a0f117e45722c8cc1f9865ff Mon Sep 17 00:00:00 2001 From: James Cole Date: Thu, 29 Dec 2016 09:02:23 +0100 Subject: [PATCH] Clean up some money formatting routines. --- app/Support/Amount.php | 81 +++++----------- app/Support/Twig/Journal.php | 92 ------------------- app/Support/Twig/Transaction.php | 54 ++++++----- resources/views/list/journals-tasker.twig | 5 +- .../views/list/journals-tiny-tasker.twig | 5 +- .../views/popup/list/journals-tasker.twig | 5 +- .../partials/journals-audit-tasker.twig | 5 +- .../views/search/partials/transactions.twig | 5 +- resources/views/transactions/show.twig | 18 ++-- 9 files changed, 75 insertions(+), 195 deletions(-) diff --git a/app/Support/Amount.php b/app/Support/Amount.php index c283289933..2a481683a8 100644 --- a/app/Support/Amount.php +++ b/app/Support/Amount.php @@ -43,16 +43,16 @@ class Amount * This method will properly format the given number, in color or "black and white", * as a currency, given two things: the currency required and the current locale. * - * @param TransactionCurrency $format - * @param string $amount - * @param bool $coloured + * @param \FireflyIII\Models\TransactionCurrency $format + * @param string $amount + * @param bool $coloured * * @return string */ public function formatAnything(TransactionCurrency $format, string $amount, bool $coloured = true): string { $locale = setlocale(LC_MONETARY, 0); - $float = round($amount, 2); + $float = round($amount, 12); $formatter = new NumberFormatter($locale, NumberFormatter::CURRENCY); $result = $formatter->formatCurrency($float, $format->code); @@ -74,6 +74,22 @@ class Amount return $result; } + /** + * Used in many places (unfortunately). + * + * @param string $currencyCode + * @param string $amount + * @param bool $coloured + * + * @return string + */ + public function formatByCode(string $currencyCode, string $amount, bool $coloured = true): string + { + $currency = TransactionCurrency::whereCode($currencyCode)->first(); + + return $this->formatAnything($currency, $amount, $coloured); + } + /** * * @param \FireflyIII\Models\TransactionJournal $journal @@ -83,27 +99,9 @@ class Amount */ public function formatJournal(TransactionJournal $journal, bool $coloured = true): string { - $locale = setlocale(LC_MONETARY, 0); - $float = round(TransactionJournal::amount($journal), 2); - $formatter = new NumberFormatter($locale, NumberFormatter::CURRENCY); - $currencyCode = $journal->transaction_currency_code ?? $journal->transactionCurrency->code; - $result = $formatter->formatCurrency($float, $currencyCode); + $currency = $journal->transactionCurrency; - if ($coloured === true && $float === 0.00) { - return '' . $result . ''; // always grey. - } - if (!$coloured) { - return $result; - } - if (!$journal->isTransfer()) { - if ($float > 0) { - return '' . $result . ''; - } - - return '' . $result . ''; - } else { - return '' . $result . ''; - } + return $this->formatAnything($currency, TransactionJournal::amount($journal), $coloured); } /** @@ -119,41 +117,6 @@ class Amount return $this->formatAnything($currency, strval($transaction->amount), $coloured); } - /** - * This method will properly format the given number, in color or "black and white", - * as a currency, given two things: the currency required and the currency code. - * - * @param string $code - * @param string $amount - * @param bool $coloured - * - * @return string - */ - public function formatWithCode(string $code, string $amount, bool $coloured = true): string - { - $locale = setlocale(LC_MONETARY, 0); - $float = round($amount, 2); - $formatter = new NumberFormatter($locale, NumberFormatter::CURRENCY); - $result = $formatter->formatCurrency($float, $code); - - if ($coloured === true) { - - if ($amount > 0) { - return sprintf('%s', $result); - } else { - if ($amount < 0) { - return sprintf('%s', $result); - } - } - - return sprintf('%s', $result); - - - } - - return $result; - } - /** * @return Collection */ diff --git a/app/Support/Twig/Journal.php b/app/Support/Twig/Journal.php index 5039212e22..3c52ad161e 100644 --- a/app/Support/Twig/Journal.php +++ b/app/Support/Twig/Journal.php @@ -33,96 +33,6 @@ use Twig_SimpleFunction; class Journal extends Twig_Extension { - /** - * @return Twig_SimpleFunction - */ - public function formatAccountPerspective(): Twig_SimpleFunction - { - return new Twig_SimpleFunction( - 'formatAccountPerspective', function (TransactionJournal $journal, Account $account) { - - $cache = new CacheProperties; - $cache->addProperty('formatAccountPerspective'); - $cache->addProperty($journal->id); - $cache->addProperty($account->id); - - if ($cache->has()) { - return $cache->get(); - } - - // get the account amount: - $transactions = $journal->transactions()->where('transactions.account_id', $account->id)->get(['transactions.*']); - $amount = '0'; - foreach ($transactions as $transaction) { - $amount = bcadd($amount, strval($transaction->amount)); - } - if ($journal->isTransfer()) { - $amount = bcmul($amount, '-1'); - } - - // check if this sum is the same as the journal: - $journalSum = TransactionJournal::amount($journal); - $full = Amount::formatJournal($journal); - if (bccomp($journalSum, $amount) === 0 || bccomp(bcmul($journalSum, '-1'), $amount) === 0) { - $cache->store($full); - - return $full; - } - - $formatted = Amount::format($amount, true); - - if ($journal->isTransfer()) { - $formatted = '' . Amount::format($amount) . ''; - } - $str = $formatted . ' (' . $full . ')'; - $cache->store($str); - - return $str; - - } - ); - } - - /** - * @return Twig_SimpleFunction - */ - public function formatBudgetPerspective(): Twig_SimpleFunction - { - return new Twig_SimpleFunction( - 'formatBudgetPerspective', function (TransactionJournal $journal, ModelBudget $budget) { - - $cache = new CacheProperties; - $cache->addProperty('formatBudgetPerspective'); - $cache->addProperty($journal->id); - $cache->addProperty($budget->id); - - if ($cache->has()) { - return $cache->get(); - } - - // get the account amount: - $transactions = $journal->transactions()->where('transactions.amount', '<', 0)->get(['transactions.*']); - $amount = '0'; - foreach ($transactions as $transaction) { - $currentBudget = $transaction->budgets->first(); - if (!is_null($currentBudget) && $currentBudget->id === $budget->id) { - $amount = bcadd($amount, strval($transaction->amount)); - } - } - if ($amount === '0') { - $formatted = Amount::formatJournal($journal); - $cache->store($formatted); - - return $formatted; - } - - $formatted = Amount::format($amount, true) . ' (' . Amount::formatJournal($journal) . ')'; - $cache->store($formatted); - - return $formatted; - } - ); - } /** * @return Twig_SimpleFunction @@ -178,8 +88,6 @@ class Journal extends Twig_Extension $functions = [ $this->getSourceAccount(), $this->getDestinationAccount(), - $this->formatAccountPerspective(), - $this->formatBudgetPerspective(), $this->journalBudgets(), $this->journalCategories(), ]; diff --git a/app/Support/Twig/Transaction.php b/app/Support/Twig/Transaction.php index 63f38a3a7f..d00150518a 100644 --- a/app/Support/Twig/Transaction.php +++ b/app/Support/Twig/Transaction.php @@ -17,6 +17,7 @@ use Amount; use Crypt; use FireflyIII\Models\AccountType; use FireflyIII\Models\Transaction as TransactionModel; +use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionType; use Twig_Extension; use Twig_SimpleFilter; @@ -29,15 +30,16 @@ use Twig_SimpleFunction; */ class Transaction extends Twig_Extension { + /** * @return Twig_SimpleFunction */ - public function formatAmountPlainWithCode(): Twig_SimpleFunction + public function formatAnything(): Twig_SimpleFunction { return new Twig_SimpleFunction( - 'formatAmountPlainWithCode', function (string $amount, string $code): string { + 'formatAnything', function (TransactionCurrency $currency, string $amount): string { - return Amount::formatWithCode($code, $amount, false); + return Amount::formatAnything($currency, $amount, true); }, ['is_safe' => ['html']] ); @@ -46,12 +48,26 @@ class Transaction extends Twig_Extension /** * @return Twig_SimpleFunction */ - public function formatAmountWithCode(): Twig_SimpleFunction + public function formatAnythingPlain(): Twig_SimpleFunction { return new Twig_SimpleFunction( - 'formatAmountWithCode', function (string $amount, string $code): string { + 'formatAnythingPlain', function (TransactionCurrency $currency, string $amount): string { - return Amount::formatWithCode($code, $amount, true); + return Amount::formatAnything($currency, $amount, false); + + }, ['is_safe' => ['html']] + ); + } + + /** + * @return Twig_SimpleFunction + */ + public function formatByCode(): Twig_SimpleFunction + { + return new Twig_SimpleFunction( + 'formatByCode', function (string $currencyCode, string $amount): string { + + return Amount::formatByCode($currencyCode, $amount, true); }, ['is_safe' => ['html']] ); @@ -75,8 +91,8 @@ class Transaction extends Twig_Extension public function getFunctions(): array { $functions = [ - $this->formatAmountWithCode(), - $this->formatAmountPlainWithCode(), + $this->formatAnything(), + $this->formatAnythingPlain(), $this->transactionSourceAccount(), $this->transactionDestinationAccount(), $this->optionalJournalAmount(), @@ -85,6 +101,7 @@ class Transaction extends Twig_Extension $this->transactionCategories(), $this->transactionIdCategories(), $this->splitJournalIndicator(), + $this->formatByCode(), ]; return $functions; @@ -107,24 +124,17 @@ class Transaction extends Twig_Extension { return new Twig_SimpleFunction( 'optionalJournalAmount', function (int $journalId, string $transactionAmount, string $code, string $type): string { - - $amount = strval( - TransactionModel::where('transaction_journal_id', $journalId) - ->whereNull('deleted_at') - ->where('amount', '<', 0) - ->sum('amount') - ); - + // get amount of journal: + $amount = strval(TransactionModel::where('transaction_journal_id', $journalId)->whereNull('deleted_at')->where('amount', '<', 0)->sum('amount')); + // display deposit and transfer positive if ($type === TransactionType::DEPOSIT || $type === TransactionType::TRANSFER) { $amount = bcmul($amount, '-1'); } - if ( - bccomp($amount, $transactionAmount) !== 0 - && bccomp($amount, bcmul($transactionAmount, '-1')) !== 0 - ) { - // not equal? - return sprintf(' (%s)', Amount::formatWithCode($code, $amount, true)); + // not equal to transaction amount? + if (bccomp($amount, $transactionAmount) !== 0 && bccomp($amount, bcmul($transactionAmount, '-1')) !== 0) { + //$currency = + return sprintf(' (%s)', 'x'); // Amount::formatWithCode($code, $amount, true) } return ''; diff --git a/resources/views/list/journals-tasker.twig b/resources/views/list/journals-tasker.twig index daa673cfb9..b54fb18fa1 100644 --- a/resources/views/list/journals-tasker.twig +++ b/resources/views/list/journals-tasker.twig @@ -70,10 +70,9 @@ - {{ formatAmountWithCode(transaction.transaction_amount, transaction.transaction_currency_code) }} + {{ formatByCode(transaction.transaction_currency_code, transaction.transaction_amount) }} - {{ optionalJournalAmount(transaction.journal_id, transaction.transaction_amount, - transaction.transaction_currency_code, transaction.transaction_type_type) }} + {{ optionalJournalAmount(transaction.journal_id, transaction.transaction_amount, transaction.transaction_currency_code, transaction.transaction_type_type) }} diff --git a/resources/views/list/journals-tiny-tasker.twig b/resources/views/list/journals-tiny-tasker.twig index a8eae3298d..190d28cf37 100644 --- a/resources/views/list/journals-tiny-tasker.twig +++ b/resources/views/list/journals-tiny-tasker.twig @@ -15,10 +15,9 @@ {% endif %} - {{ formatAmountWithCode(transaction.transaction_amount, transaction.transaction_currency_code) }} + {{ formatByCode(transaction.transaction_currency_code, transaction.transaction_amount) }} - {{ optionalJournalAmount(transaction.journal_id, transaction.transaction_amount, - transaction.transaction_currency_code, transaction.transaction_type_type) }} + {{ optionalJournalAmount(transaction.journal_id, transaction.transaction_amount, transaction.transaction_currency_code, transaction.transaction_type_type) }} {% endfor %} diff --git a/resources/views/popup/list/journals-tasker.twig b/resources/views/popup/list/journals-tasker.twig index 36c36aeccb..d6f97dcc59 100644 --- a/resources/views/popup/list/journals-tasker.twig +++ b/resources/views/popup/list/journals-tasker.twig @@ -46,10 +46,9 @@ - {{ formatAmountWithCode(transaction.transaction_amount, transaction.transaction_currency_code) }} + {{ formatByCode(transaction.transaction_currency_code, transaction.transaction_amount) }} - {{ optionalJournalAmount(transaction.journal_id, transaction.transaction_amount, - transaction.transaction_currency_code, transaction.transaction_type_type) }} + {{ optionalJournalAmount(transaction.journal_id, transaction.transaction_amount, transaction.transaction_currency_code, transaction.transaction_type_type) }} {{ transaction.date.formatLocalized(monthAndDayFormat) }} diff --git a/resources/views/reports/partials/journals-audit-tasker.twig b/resources/views/reports/partials/journals-audit-tasker.twig index 50e9ed6a00..824dd126bc 100644 --- a/resources/views/reports/partials/journals-audit-tasker.twig +++ b/resources/views/reports/partials/journals-audit-tasker.twig @@ -60,10 +60,9 @@ {{ transaction.before|formatAmount }} - {{ formatAmountWithCode(transaction.transaction_amount, transaction.transaction_currency_code) }} + {{ formatByCode(transaction.transaction_currency_code, transaction.transaction_amount) }} - {{ optionalJournalAmount(transaction.journal_id, transaction.transaction_amount, - transaction.transaction_currency_code, transaction.transaction_type_type) }} + {{ optionalJournalAmount(transaction.journal_id, transaction.transaction_amount, transaction.transaction_currency_code, transaction.transaction_type_type) }} {{ transaction.after|formatAmount }} diff --git a/resources/views/search/partials/transactions.twig b/resources/views/search/partials/transactions.twig index 279a336a3c..587c9b432d 100644 --- a/resources/views/search/partials/transactions.twig +++ b/resources/views/search/partials/transactions.twig @@ -40,10 +40,9 @@ - {{ formatAmountWithCode(transaction.transaction_amount, transaction.transaction_currency_code) }} + {{ formatByCode(transaction.transaction_currency_code, transaction.transaction_amount) }} - {{ optionalJournalAmount(transaction.journal_id, transaction.transaction_amount, - transaction.transaction_currency_code, transaction.transaction_type_type) }} + {{ optionalJournalAmount(transaction.journal_id, transaction.transaction_amount, transaction.transaction_currency_code, transaction.transaction_type_type) }} diff --git a/resources/views/transactions/show.twig b/resources/views/transactions/show.twig index d9b8242094..f20e920b98 100644 --- a/resources/views/transactions/show.twig +++ b/resources/views/transactions/show.twig @@ -285,8 +285,9 @@ - {{ formatAmountWithCode(transaction.source_account_before,journal.transactionCurrency.code) }} - ⟶ {{ formatAmountWithCode(transaction.source_account_after,journal.transactionCurrency.code) }} + + {{ formatAnything(journal.transactionCurrency, transaction.source_account_before) }} + ⟶ {{ formatAnything(journal.transactionCurrency, transaction.source_account_after) }} {% if transaction.destination_account_type == 'Cash account' %} @@ -297,23 +298,26 @@ - {{ formatAmountWithCode(transaction.destination_account_before,journal.transactionCurrency.code) }} - ⟶ {{ formatAmountWithCode(transaction.destination_account_after,journal.transactionCurrency.code) }} + + {{ formatAnything(journal.transactionCurrency, transaction.destination_account_before) }} + ⟶ {{ formatAnything(journal.transactionCurrency, transaction.destination_account_after) }} {% if journal.transactiontype.type == 'Deposit' %} - {{ formatAmountWithCode(transaction.destination_amount, journal.transactionCurrency.code) }} + {{ formatAnything(journal.transactionCurrency, transaction.destination_amount) }} {% endif %} {% if journal.transactiontype.type == 'Withdrawal' %} - {{ formatAmountWithCode(transaction.source_amount, journal.transactionCurrency.code) }} + {{ formatAnything(journal.transactionCurrency, transaction.source_amount) }} {% endif %} {% if journal.transactiontype.type == 'Transfer' %} - {{ formatAmountPlainWithCode(transaction.destination_amount, journal.transactionCurrency.code) }} + + {{ formatAnythingPlain(journal.transactionCurrency, transaction.destination_amount) }} + {% endif %}