diff --git a/app/Http/Controllers/Transaction/EditController.php b/app/Http/Controllers/Transaction/EditController.php
new file mode 100644
index 0000000000..b0a8646d6a
--- /dev/null
+++ b/app/Http/Controllers/Transaction/EditController.php
@@ -0,0 +1,81 @@
+.
+ */
+
+namespace FireflyIII\Http\Controllers\Transaction;
+
+
+use FireflyIII\Http\Controllers\Controller;
+use FireflyIII\Models\TransactionGroup;
+use FireflyIII\Repositories\Account\AccountRepositoryInterface;
+
+/**
+ * Class EditController
+ */
+class EditController extends Controller
+{
+
+ /**
+ * SingleController constructor.
+ */
+ public function __construct()
+ {
+ parent::__construct();
+
+ $maxFileSize = app('steam')->phpBytes(ini_get('upload_max_filesize'));
+ $maxPostSize = app('steam')->phpBytes(ini_get('post_max_size'));
+ $uploadSize = min($maxFileSize, $maxPostSize);
+
+
+ app('view')->share('uploadSize', $uploadSize);
+
+ // some useful repositories:
+ $this->middleware(
+ function ($request, $next) {
+
+ app('view')->share('title', (string)trans('firefly.transactions'));
+ app('view')->share('mainTitleIcon', 'fa-repeat');
+
+ return $next($request);
+ }
+ );
+ }
+
+
+ /**
+ * @param TransactionGroup $transactionGroup
+ * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
+ */
+ public function edit(TransactionGroup $transactionGroup)
+ {
+ /** @var AccountRepositoryInterface $repository */
+ $repository = app(AccountRepositoryInterface::class);
+ $allowedOpposingTypes = config('firefly.allowed_opposing_types');
+ $accountToTypes = config('firefly.account_to_transaction');
+ $defaultCurrency = app('amount')->getDefaultCurrency();
+ $cash = $repository->getCashAccount();
+
+ return view('transactions.edit', compact('cash', 'transactionGroup', 'allowedOpposingTypes', 'accountToTypes', 'defaultCurrency'
+
+ ));
+
+ }
+
+}
\ No newline at end of file
diff --git a/app/Services/Internal/Update/GroupUpdateService.php b/app/Services/Internal/Update/GroupUpdateService.php
index ae54bbe4fd..87b4c8c00a 100644
--- a/app/Services/Internal/Update/GroupUpdateService.php
+++ b/app/Services/Internal/Update/GroupUpdateService.php
@@ -56,10 +56,10 @@ class GroupUpdateService
Log::debug(sprintf('Will now update journal #%d (only journal in group #%d)', $first->id, $transactionGroup->id));
$this->updateTransactionJournal($transactionGroup, $first, reset($transactions));
$transactionGroup->refresh();
-
+ app('preferences')->mark();
return $transactionGroup;
}
- die('cannot update split');
+ die('cannot update split yet.');
app('preferences')->mark();
}
diff --git a/app/Transformers/TransactionGroupTransformer.php b/app/Transformers/TransactionGroupTransformer.php
index c5e71e7a29..4ac0447a1e 100644
--- a/app/Transformers/TransactionGroupTransformer.php
+++ b/app/Transformers/TransactionGroupTransformer.php
@@ -295,6 +295,7 @@ class TransactionGroupTransformer extends AbstractTransformer
'currency_id' => $row['currency_id'],
'currency_code' => $row['currency_code'],
+ 'currency_name' => $row['currency_name'],
'currency_symbol' => $row['currency_symbol'],
'currency_decimal_places' => $row['currency_decimal_places'],
diff --git a/public/v1/js/app.js b/public/v1/js/app.js
index fc8910caa6..6ee10da05a 100644
--- a/public/v1/js/app.js
+++ b/public/v1/js/app.js
@@ -12551,7 +12551,9 @@ Vue.component('account-select', __webpack_require__(119));
Vue.component('passport-clients', __webpack_require__(124));
Vue.component('passport-authorized-clients', __webpack_require__(129));
Vue.component('passport-personal-access-tokens', __webpack_require__(134));
+
Vue.component('create-transaction', __webpack_require__(139));
+Vue.component('edit-transaction', __webpack_require__(144));
var app = new Vue({
el: '#app'
@@ -51533,7 +51535,7 @@ exports = module.exports = __webpack_require__(0)(false);
// module
-exports.push([module.i, "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", ""]);
+exports.push([module.i, "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", ""]);
// exports
@@ -51600,30 +51602,44 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
return this.error.length > 0;
},
changeData: function changeData() {
+ var transactionType = this.transactionType;
// reset of all are empty:
- //console.log('Type "' + this.transactionType + '"');
+ //console.log('Type "' + transactionType + '"');
//console.log('Source "' + this.source.name + '"');
//console.log('Dest "' + this.destination.name + '"');
- if (!this.transactionType && !this.source.name && !this.destination.name) {
+ if (!transactionType && !this.source.name && !this.destination.name) {
$(this.$refs.cur).text('');
+ console.log('A');
return;
}
- if ('' === this.transactionType && '' !== this.source.currency_name) {
+ if (null === transactionType) {
+ transactionType = '';
+ }
+
+ if ('' === transactionType && '' !== this.source.currency_name) {
$(this.$refs.cur).text(this.source.currency_name);
+ console.log('B');
return;
}
- if ('' === this.transactionType && '' !== this.destination.currency_name) {
+ if ('' === transactionType && '' !== this.destination.currency_name) {
$(this.$refs.cur).text(this.destination.currency_name);
+ console.log('C');
return;
}
- if (this.transactionType === 'Withdrawal' || this.transactionType === 'Transfer') {
+ if (transactionType === 'Withdrawal' || transactionType === 'Transfer') {
$(this.$refs.cur).text(this.source.currency_name);
+ console.log('D');
return;
}
- if (this.transactionType === 'Deposit') {
+ if (transactionType === 'Deposit') {
$(this.$refs.cur).text(this.destination.currency_name);
+ console.log('E');
return;
}
+ console.log('transactionType: ' + transactionType);
+ console.log('this.source.name: ' + this.source.name);
+ console.log('this.destination.name: ' + this.destination.name);
+ console.log('F');
}
},
watch: {
@@ -54882,7 +54898,7 @@ exports = module.exports = __webpack_require__(0)(false);
// module
-exports.push([module.i, "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", ""]);
+exports.push([module.i, "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", ""]);
// exports
@@ -55270,6 +55286,10 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
if (this.resetFormAfter) {
this.resetTransactions();
}
+
+ var button = $(e.currentTarget);
+ button.prop("disabled", true);
+
axios.post(uri, data).then(function (response) {
if (_this.createAnother) {
// do message:
@@ -55278,6 +55298,7 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
if (_this.resetFormAfter) {
_this.addTransaction();
}
+ button.prop("disabled", false);
} else {
window.location.href = 'transactions/show/' + response.data.data.id + '?message=created';
}
@@ -55286,6 +55307,7 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
// something something render errors.
_this.parseErrors(error.response.data);
// something.
+ button.prop("disabled", false);
});
if (e) {
e.preventDefault();
@@ -56072,7 +56094,11 @@ var render = function() {
_c("div", { staticClass: "btn-group" }, [
_c(
"button",
- { staticClass: "btn btn-success", on: { click: _vm.submit } },
+ {
+ staticClass: "btn btn-success",
+ attrs: { id: "submitButton" },
+ on: { click: _vm.submit }
+ },
[_vm._v("Submit")]
)
])
@@ -56150,5 +56176,1301 @@ if (false) {
}
}
+/***/ }),
+/* 144 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var disposed = false
+function injectStyle (ssrContext) {
+ if (disposed) return
+ __webpack_require__(145)
+}
+var normalizeComponent = __webpack_require__(2)
+/* script */
+var __vue_script__ = __webpack_require__(147)
+/* template */
+var __vue_template__ = __webpack_require__(148)
+/* template functional */
+var __vue_template_functional__ = false
+/* styles */
+var __vue_styles__ = injectStyle
+/* scopeId */
+var __vue_scopeId__ = "data-v-16510831"
+/* moduleIdentifier (server only) */
+var __vue_module_identifier__ = null
+var Component = normalizeComponent(
+ __vue_script__,
+ __vue_template__,
+ __vue_template_functional__,
+ __vue_styles__,
+ __vue_scopeId__,
+ __vue_module_identifier__
+)
+Component.options.__file = "resources/assets/js/components/transactions/EditTransaction.vue"
+
+/* hot reload */
+if (false) {(function () {
+ var hotAPI = require("vue-hot-reload-api")
+ hotAPI.install(require("vue"), false)
+ if (!hotAPI.compatible) return
+ module.hot.accept()
+ if (!module.hot.data) {
+ hotAPI.createRecord("data-v-16510831", Component.options)
+ } else {
+ hotAPI.reload("data-v-16510831", Component.options)
+ }
+ module.hot.dispose(function (data) {
+ disposed = true
+ })
+})()}
+
+module.exports = Component.exports
+
+
+/***/ }),
+/* 145 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// style-loader: Adds some css to the DOM by adding a
\ No newline at end of file
diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php
index 3dbcd87920..b74d2b0c26 100644
--- a/resources/lang/en_US/firefly.php
+++ b/resources/lang/en_US/firefly.php
@@ -852,6 +852,7 @@ return [
'deleted_transfer' => 'Successfully deleted transfer ":description"',
'stored_journal' => 'Successfully created new transaction ":description"',
'stored_journal_no_descr' => 'Successfully created your new transaction',
+ 'updated_journal_no_descr' => 'Successfully updated your transaction',
'select_transactions' => 'Select transactions',
'rule_group_select_transactions' => 'Apply ":title" to transactions',
'rule_select_transactions' => 'Apply ":title" to transactions',
diff --git a/resources/views/v1/transactions/create.twig b/resources/views/v1/transactions/create.twig
index 353f56b092..31a305aac8 100644
--- a/resources/views/v1/transactions/create.twig
+++ b/resources/views/v1/transactions/create.twig
@@ -6,6 +6,8 @@
{% block content %}
+ {# TODO attachments #}
+
- {{ 'source_accounts'|_ }} - | -- {% for journal in groupArray.transactions %} - - {{ journal.source_name }} - - {% if loop.index0 != groupArray.transactions|length -1 %}, {% endif %} - {% endfor %} - | -||||||||||||||||||||||
- {{ 'destination_accounts'|_ }} - - | -- {% for journal in groupArray.transactions %} - - {{ journal.destination_name }} - - {% if loop.index0 != groupArray.transactions|length -1 %}, {% endif %} - {% endfor %} - | -
{{ 'total_amount'|_ }} | - {% for amount in amounts %} - {% if type == 'Withdrawal' or type == 'Deposit' %} - {{ formatAmountBySymbol(amount.amount*-1,amount.symbol, amount.decimal_places) }}, - {% elseif type == 'Transfer' %} - - {{ formatAmountBySymbol(amount.amount, amount.symbol, amount.decimal_places, false) }}, - - {% endif %} + {{ 'source_accounts'|_ }} + | ++ {% for journal in groupArray.transactions %} + + {{ journal.source_name }} + + {% if loop.index0 != groupArray.transactions|length -1 %}, {% endif %} {% endfor %} |
+ {{ 'destination_accounts'|_ }} + + | ++ {% for journal in groupArray.transactions %} + + {{ journal.destination_name }} + + {% if loop.index0 != groupArray.transactions|length -1 %}, {% endif %} + {% endfor %} + | +|
{{ 'total_amount'|_ }} | ++ {% for amount in amounts %} + {% if type == 'Withdrawal' or type == 'Deposit' %} + {{ formatAmountBySymbol(amount.amount*-1,amount.symbol, amount.decimal_places) }}, + {% elseif type == 'Transfer' %} + + {{ formatAmountBySymbol(amount.amount, amount.symbol, amount.decimal_places, false) }}, + + {% endif %} + {% endfor %} + | +
+ {{ journal.source_name }} → + {% if type == 'Withdrawal' or type == 'Deposit' %} + {{ formatAmountBySymbol(journal.amount*-1, journal.currency_symbol, journal.currency_decimal_places) }} + {% elseif type == 'Transfer' %} + + {{ formatAmountBySymbol(journal.amount, journal.currency_symbol, journal.currency_decimal_places, false) }} + + {% endif %} + + + {% if null != journal.foreign_amount %} + {% if type == 'Withdrawal' or type == 'Deposit' %} + ({{ formatAmountBySymbol(journal.foreign_amount*-1, journal.foreign_currency_symbol, journal.foreign_currency_decimal_places) }}) + {% elseif type == 'Transfer' %} + + ({{ formatAmountBySymbol(journal.foreign_amount, journal.foreign_currency_symbol, journal.foreign_currency_decimal_places, false) }}) + + {% endif %} + {% endif %} + + + → + {{ journal.destination_name }} + | +|
{{ 'category'|_ }} | +{{ journal.category_name }} | +
{{ 'budget'|_ }} | +{{ journal.budget_name }} | +
{{ 'bill'|_ }} | +{{ journal.bill_name }} | +
{{ trans('list.'~dateField) }} | +{{ journalGetMetaDate(journal.transaction_journal_id, dateField).formatLocalized(monthAndDayFormat) }} | +
{{ trans('list.'~metaField) }} | +{{ journalGetMetaField(journal.transaction_journal_id, metaField) }} | +
{{ trans('list.notes') }} | +{{ journal.notes|markdown }} | +
{{ 'tags'|_ }} | +
+ {% for tag in journal.tags %}
+ + + {{ tag }} ++ {% endfor %} + |
+
- {{ journal.source_name }} → - {% if type == 'Withdrawal' or type == 'Deposit' %} - {{ formatAmountBySymbol(journal.amount*-1, journal.currency_symbol, journal.currency_decimal_places) }} - {% elseif type == 'Transfer' %} - - {{ formatAmountBySymbol(journal.amount, journal.currency_symbol, journal.currency_decimal_places, false) }} - - {% endif %} + {% for link in links[journal.transaction_journal_id] %} + | |
+ + | +{{ link.link }} "{{ link.description }}" - - {% if null != journal.foreign_amount %} - {% if type == 'Withdrawal' or type == 'Deposit' %} - ({{ formatAmountBySymbol(journal.foreign_amount*-1, journal.foreign_currency_symbol, journal.foreign_currency_decimal_places) }}) - {% elseif type == 'Transfer' %} - - ({{ formatAmountBySymbol(journal.foreign_amount, journal.foreign_currency_symbol, journal.foreign_currency_decimal_places, false) }}) - + ({{ link.amount|raw }}) + {% if '' != link.foreign_amount %} + ({{ link.foreign_amount|raw }}) {% endif %} - {% endif %} - - - → - {{ journal.destination_name }} - | -
{{ 'category'|_ }} | -{{ journal.category_name }} | -
{{ 'budget'|_ }} | -{{ journal.budget_name }} | -
{{ 'bill'|_ }} | -{{ journal.bill_name }} | -
{{ trans('list.'~dateField) }} | -{{ journalGetMetaDate(journal.transaction_journal_id, dateField).formatLocalized(monthAndDayFormat) }} | -
{{ trans('list.'~metaField) }} | -{{ journalGetMetaField(journal.transaction_journal_id, metaField) }} | -
{{ trans('list.notes') }} | -{{ journal.notes|markdown }} | -
{{ 'tags'|_ }} | -
- {% for tag in journal.tags %}
- - - {{ tag }} -- {% endfor %} |
- - | -{{ link.link }} "{{ link.description }}" - - ({{ link.amount|raw }}) - {% if '' != link.foreign_amount %} - ({{ link.foreign_amount|raw }}) - {% endif %} - | -
- - | -
+
+
-
- {% endif %}
-
-
- {% if events[journal.transaction_journal_id]|length > 0 %}
-
-
- {% endif %}
-
- {% endfor %}
-
-
-{% endblock %}
-{% block scripts %}
-{% endblock %}
-
- {#
-
- {% if links.count > 0 %}
-
-
- {{ 'piggy_events'|_ }}-
-
-
-
-
-
- {{ 'journal_links'|_ }}-
-
+ {% endif %} - + + {% if events[journal.transaction_journal_id]|length > 0 %} +
+
{% endif %}
-
-
+
+ {{ 'piggy_events'|_ }}+
+
+
-
+ {% endfor %}
+
+
+{% endblock %}
+{% block scripts %}
+{% endblock %}
+
+{#
+
+ {% if links.count > 0 %}
-
- {{ 'transactions'|_ }}+{{ 'journal_links'|_ }}
-
+ + + {% endif %} + + +
+
-
+
+
+
+
+ {{ 'transactions'|_ }}+
+
- |