Clean up some money formatting routines.

This commit is contained in:
James Cole
2016-12-29 09:02:23 +01:00
parent eaefb7136a
commit de56c18c6e
9 changed files with 75 additions and 195 deletions

View File

@@ -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 = '<span class="text-info">' . Amount::format($amount) . '</span>';
}
$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(),
];

View File

@@ -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 '';