mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-02-25 18:45:27 -06:00
Some improvements, also edit screen.
This commit is contained in:
parent
0a6e20eae4
commit
2a2f29533d
81
app/Http/Controllers/Transaction/EditController.php
Normal file
81
app/Http/Controllers/Transaction/EditController.php
Normal file
@ -0,0 +1,81 @@
|
||||
<?php
|
||||
/**
|
||||
* EditController.php
|
||||
* Copyright (c) 2019 thegrumpydictator@gmail.com
|
||||
*
|
||||
* This file is part of Firefly III.
|
||||
*
|
||||
* Firefly III is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Firefly III is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
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'
|
||||
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -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();
|
||||
}
|
||||
|
@ -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'],
|
||||
|
||||
|
1340
public/v1/js/app.js
vendored
1340
public/v1/js/app.js
vendored
File diff suppressed because it is too large
Load Diff
2
resources/assets/js/app.js
vendored
2
resources/assets/js/app.js
vendored
@ -59,7 +59,9 @@ Vue.component('account-select', require('./components/transactions/AccountSelect
|
||||
Vue.component('passport-clients', require('./components/passport/Clients.vue'));
|
||||
Vue.component('passport-authorized-clients', require('./components/passport/AuthorizedClients.vue'));
|
||||
Vue.component('passport-personal-access-tokens', require('./components/passport/PersonalAccessTokens.vue'));
|
||||
|
||||
Vue.component('create-transaction', require('./components/transactions/CreateTransaction'));
|
||||
Vue.component('edit-transaction', require('./components/transactions/EditTransaction'));
|
||||
|
||||
|
||||
const app = new Vue({
|
||||
|
@ -52,30 +52,44 @@
|
||||
return this.error.length > 0;
|
||||
},
|
||||
changeData: function () {
|
||||
let 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: {
|
||||
|
@ -194,7 +194,7 @@
|
||||
</div>
|
||||
<div class="box-footer">
|
||||
<div class="btn-group">
|
||||
<button class="btn btn-success" @click="submit">Submit</button>
|
||||
<button class="btn btn-success" id="submitButton" @click="submit">Submit</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -310,10 +310,10 @@
|
||||
}
|
||||
|
||||
// correct some id's
|
||||
if(0 === destId) {
|
||||
if (0 === destId) {
|
||||
destId = null;
|
||||
}
|
||||
if(0 === sourceId) {
|
||||
if (0 === sourceId) {
|
||||
sourceId = null;
|
||||
}
|
||||
|
||||
@ -377,6 +377,10 @@
|
||||
if (this.resetFormAfter) {
|
||||
this.resetTransactions();
|
||||
}
|
||||
|
||||
let button = $(e.currentTarget);
|
||||
button.prop("disabled", true);
|
||||
|
||||
axios.post(uri, data)
|
||||
.then(response => {
|
||||
if (this.createAnother) {
|
||||
@ -386,6 +390,7 @@
|
||||
if (this.resetFormAfter) {
|
||||
this.addTransaction();
|
||||
}
|
||||
button.prop("disabled", false);
|
||||
} else {
|
||||
window.location.href = 'transactions/show/' + response.data.data.id + '?message=created';
|
||||
}
|
||||
@ -394,6 +399,7 @@
|
||||
// something something render errors.
|
||||
this.parseErrors(error.response.data);
|
||||
// something.
|
||||
button.prop("disabled", false);
|
||||
});
|
||||
if (e) {
|
||||
e.preventDefault();
|
||||
|
711
resources/assets/js/components/transactions/EditTransaction.vue
Normal file
711
resources/assets/js/components/transactions/EditTransaction.vue
Normal file
@ -0,0 +1,711 @@
|
||||
<!--
|
||||
- EditTransaction.vue
|
||||
- Copyright (c) 2019 thegrumpydictator@gmail.com
|
||||
-
|
||||
- This file is part of Firefly III.
|
||||
-
|
||||
- Firefly III is free software: you can redistribute it and/or modify
|
||||
- it under the terms of the GNU General Public License as published by
|
||||
- the Free Software Foundation, either version 3 of the License, or
|
||||
- (at your option) any later version.
|
||||
-
|
||||
- Firefly III is distributed in the hope that it will be useful,
|
||||
- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
- GNU General Public License for more details.
|
||||
-
|
||||
- You should have received a copy of the GNU General Public License
|
||||
- along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
|
||||
-->
|
||||
|
||||
<template>
|
||||
<form method="POST" action="transactions/update" accept-charset="UTF-8" class="form-horizontal" id="store"
|
||||
enctype="multipart/form-data">
|
||||
<input name="_token" type="hidden" value="xxx">
|
||||
<div class="row" v-if="error_message !== ''">
|
||||
<div class="col-lg-12">
|
||||
<div class="alert alert-danger alert-dismissible" role="alert">
|
||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span
|
||||
aria-hidden="true">×</span></button>
|
||||
<strong>Error!</strong> {{ error_message }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row" v-if="success_message !== ''">
|
||||
<div class="col-lg-12">
|
||||
<div class="alert alert-success alert-dismissible" role="alert">
|
||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span
|
||||
aria-hidden="true">×</span></button>
|
||||
<strong>Success!</strong> <span v-html="success_message"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row" v-if="transactions.length > 1">
|
||||
<div class="col-lg-6">
|
||||
<div class="box">
|
||||
<div class="box-header with-border">
|
||||
<h3 class="box-title">
|
||||
Description of the split transaction
|
||||
</h3>
|
||||
</div>
|
||||
<div class="box-body">
|
||||
<group-description
|
||||
:error="group_title_errors"
|
||||
v-model="group_title"
|
||||
></group-description>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div class="row" v-for="(transaction, index) in transactions">
|
||||
<div class="col-lg-12">
|
||||
<div class="box">
|
||||
<div class="box-header with-border">
|
||||
<h3 class="box-title splitTitle">
|
||||
<span v-if="transactions.length > 1">Split {{ index+1 }} / {{ transactions.length }}</span>
|
||||
<span v-if="transactions.length === 1">Transaction information</span>
|
||||
</h3>
|
||||
<div class="box-tools pull-right" v-if="transactions.length > 1" x>
|
||||
<button v-on:click="deleteTransaction(index, $event)" class="btn btn-xs btn-danger"><i
|
||||
class="fa fa-trash"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="box-body">
|
||||
<div class="row">
|
||||
<div class="col-lg-4">
|
||||
<account-select
|
||||
inputName="source[]"
|
||||
title="Source account"
|
||||
:accountName="transaction.source_account.name"
|
||||
:accountTypeFilters="transaction.source_account.allowed_types"
|
||||
:transactionType="transactionType"
|
||||
:index="index"
|
||||
v-on:clear:value="clearSource(index)"
|
||||
v-on:select:account="selectedSourceAccount(index, $event)"
|
||||
:error="transaction.errors.source_account"
|
||||
></account-select>
|
||||
<account-select
|
||||
inputName="destination[]"
|
||||
title="Destination account"
|
||||
:accountName="transaction.destination_account.name"
|
||||
:accountTypeFilters="transaction.destination_account.allowed_types"
|
||||
:transactionType="transactionType"
|
||||
:index="index"
|
||||
v-on:clear:value="clearDestination(index)"
|
||||
v-on:select:account="selectedDestinationAccount(index, $event)"
|
||||
:error="transaction.errors.destination_account"
|
||||
></account-select>
|
||||
<transaction-description
|
||||
v-model="transaction.description"
|
||||
:index="index"
|
||||
:error="transaction.errors.description"
|
||||
>
|
||||
</transaction-description>
|
||||
<standard-date
|
||||
v-model="transaction.date"
|
||||
:index="index"
|
||||
:error="transaction.errors.date"
|
||||
>
|
||||
</standard-date>
|
||||
<div v-if="index===0">
|
||||
<transaction-type
|
||||
:source="transaction.source_account.type"
|
||||
:destination="transaction.destination_account.type"
|
||||
v-on:set:transactionType="setTransactionType($event)"
|
||||
v-on:act:limitSourceType="limitSourceType($event)"
|
||||
v-on:act:limitDestinationType="limitDestinationType($event)"
|
||||
></transaction-type>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-4">
|
||||
<amount
|
||||
:source="transaction.source_account"
|
||||
:destination="transaction.destination_account"
|
||||
v-model="transaction.amount"
|
||||
:error="transaction.errors.amount"
|
||||
:transactionType="transactionType"
|
||||
></amount>
|
||||
<foreign-amount
|
||||
:source="transaction.source_account"
|
||||
:destination="transaction.destination_account"
|
||||
v-model="transaction.foreign_amount"
|
||||
:transactionType="transactionType"
|
||||
:error="transaction.errors.foreign_amount"
|
||||
></foreign-amount>
|
||||
</div>
|
||||
<div class="col-lg-4">
|
||||
<budget
|
||||
:transactionType="transactionType"
|
||||
v-model="transaction.budget"
|
||||
:error="transaction.errors.budget_id"
|
||||
></budget>
|
||||
<category
|
||||
:transactionType="transactionType"
|
||||
v-model="transaction.category"
|
||||
:error="transaction.errors.category"
|
||||
></category>
|
||||
<!--
|
||||
<piggy-bank
|
||||
:transactionType="transactionType"
|
||||
v-model="transaction.piggy_bank"
|
||||
:error="transaction.errors.piggy_bank"
|
||||
></piggy-bank>
|
||||
-->
|
||||
<tags
|
||||
v-model="transaction.tags"
|
||||
:error="transaction.errors.tags"
|
||||
></tags>
|
||||
<custom-transaction-fields
|
||||
v-model="transaction.custom_fields"
|
||||
:error="transaction.errors.custom_errors"
|
||||
></custom-transaction-fields>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="box-footer" v-if="transactions.length-1 === index">
|
||||
<button class="btn btn-primary" @click="addTransaction">Add another split</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-lg-3 col-md-4 col-sm-6 col-xs-12">
|
||||
<div class="box">
|
||||
<div class="box-header with-border">
|
||||
<h3 class="box-title">
|
||||
Submission
|
||||
</h3>
|
||||
</div>
|
||||
<div class="box-body">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input v-model="returnAfter" name="return_after" type="checkbox">
|
||||
After updating, return here to create another one.
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="box-footer">
|
||||
<div class="btn-group">
|
||||
<button class="btn btn-success" @click="submit">Update</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: "EditTransaction",
|
||||
props: {
|
||||
groupId: Number
|
||||
},
|
||||
mounted() {
|
||||
this.getGroup();
|
||||
},
|
||||
ready() {
|
||||
console.log('Ready Group ID: ' + this.groupId);
|
||||
},
|
||||
methods: {
|
||||
positiveAmount: function (amount) {
|
||||
if (amount < 0) {
|
||||
return amount * -1;
|
||||
}
|
||||
return amount;
|
||||
},
|
||||
|
||||
selectedSourceAccount: function (index, model) {
|
||||
if (typeof model === 'string') {
|
||||
// cant change types, only name.
|
||||
this.transactions[index].source_account.name = model;
|
||||
} else {
|
||||
this.transactions[index].source_account = {
|
||||
id: model.id,
|
||||
name: model.name,
|
||||
type: model.type,
|
||||
currency_id: model.currency_id,
|
||||
currency_name: model.currency_name,
|
||||
currency_code: model.currency_code,
|
||||
currency_decimal_places: model.currency_decimal_places,
|
||||
allowed_types: this.transactions[index].source_account.allowed_types
|
||||
};
|
||||
|
||||
// force types on destination selector.
|
||||
//this.transactions[index].destination_account.allowed_types = window.allowedOpposingTypes.source[model.type];
|
||||
}
|
||||
},
|
||||
selectedDestinationAccount: function (index, model) {
|
||||
if (typeof model === 'string') {
|
||||
// cant change types, only name.
|
||||
this.transactions[index].destination_account.name = model;
|
||||
} else {
|
||||
this.transactions[index].destination_account = {
|
||||
id: model.id,
|
||||
name: model.name,
|
||||
type: model.type,
|
||||
currency_id: model.currency_id,
|
||||
currency_name: model.currency_name,
|
||||
currency_code: model.currency_code,
|
||||
currency_decimal_places: model.currency_decimal_places,
|
||||
allowed_types: this.transactions[index].destination_account.allowed_types
|
||||
};
|
||||
|
||||
// force types on destination selector.
|
||||
//this.transactions[index].source_account.allowed_types = window.allowedOpposingTypes.destination[model.type];
|
||||
}
|
||||
},
|
||||
clearSource: function (index) {
|
||||
console.log('clearSource(' + index + ')');
|
||||
// reset source account:
|
||||
this.transactions[index].source_account = {
|
||||
id: 0,
|
||||
name: '',
|
||||
type: '',
|
||||
currency_id: 0,
|
||||
currency_name: '',
|
||||
currency_code: '',
|
||||
currency_decimal_places: 2,
|
||||
allowed_types: this.transactions[index].source_account.allowed_types
|
||||
};
|
||||
// reset destination allowed account types.
|
||||
// this.transactions[index].destination_account.allowed_types = [];
|
||||
|
||||
// if there is a destination model, reset the types of the source
|
||||
// by pretending we selected it again.
|
||||
if (this.transactions[index].destination_account) {
|
||||
this.selectedDestinationAccount(index, this.transactions[index].destination_account);
|
||||
}
|
||||
},
|
||||
setTransactionType: function (type) {
|
||||
this.transactionType = type;
|
||||
},
|
||||
deleteTransaction: function (index, event) {
|
||||
event.preventDefault();
|
||||
for (const key in this.transactions) {
|
||||
if (
|
||||
this.transactions.hasOwnProperty(key) && /^0$|^[1-9]\d*$/.test(key) && key <= 4294967294) {
|
||||
}
|
||||
}
|
||||
|
||||
this.transactions.splice(index, 1);
|
||||
|
||||
for (const key in this.transactions) {
|
||||
if (
|
||||
this.transactions.hasOwnProperty(key) && /^0$|^[1-9]\d*$/.test(key) && key <= 4294967294) {
|
||||
}
|
||||
}
|
||||
},
|
||||
clearDestination: function (index) {
|
||||
console.log('clearDestination(' + index + ')');
|
||||
// reset destination account:
|
||||
console.log('Destination allowed types first:');
|
||||
console.log(this.transactions[index].destination_account.allowed_types);
|
||||
this.transactions[index].destination_account = {
|
||||
id: 0,
|
||||
name: '',
|
||||
type: '',
|
||||
currency_id: 0,
|
||||
currency_name: '',
|
||||
currency_code: '',
|
||||
currency_decimal_places: 2,
|
||||
allowed_types: this.transactions[index].destination_account.allowed_types
|
||||
};
|
||||
// reset destination allowed account types.
|
||||
//this.transactions[index].source_account.allowed_types = [];
|
||||
|
||||
// if there is a source model, reset the types of the destination
|
||||
// by pretending we selected it again.
|
||||
if (this.transactions[index].source_account) {
|
||||
this.selectedSourceAccount(index, this.transactions[index].source_account);
|
||||
}
|
||||
|
||||
console.log('Destination allowed types after:');
|
||||
console.log(this.transactions[index].destination_account.allowed_types);
|
||||
},
|
||||
getGroup: function () {
|
||||
|
||||
const page = window.location.href.split('/');
|
||||
const groupId = page[page.length - 1];
|
||||
|
||||
|
||||
const uri = './api/v1/transactions/' + groupId + '?_token=' + document.head.querySelector('meta[name="csrf-token"]').content;
|
||||
console.log(uri);
|
||||
|
||||
// fill in transactions array.
|
||||
axios.get(uri)
|
||||
.then(response => {
|
||||
console.log(response.data.data);
|
||||
this.group_title = response.data.data.attributes.group_title;
|
||||
let transactions = response.data.data.attributes.transactions.reverse();
|
||||
for (let key in transactions) {
|
||||
if (transactions.hasOwnProperty(key) && /^0$|^[1-9]\d*$/.test(key) && key <= 4294967294) {
|
||||
let transaction = transactions[key];
|
||||
console.log(transactions[key]);
|
||||
this.transactions.push({
|
||||
description: transaction.description,
|
||||
date: transaction.date.substr(0, 10),
|
||||
amount: this.positiveAmount(transaction.amount),
|
||||
category: transaction.category_name,
|
||||
errors: {
|
||||
source_account: [],
|
||||
destination_account: [],
|
||||
description: [],
|
||||
amount: [],
|
||||
date: [],
|
||||
budget_id: [],
|
||||
foreign_amount: [],
|
||||
category: [],
|
||||
piggy_bank: [],
|
||||
tags: [],
|
||||
// custom fields:
|
||||
custom_errors: {
|
||||
interest_date: [],
|
||||
book_date: [],
|
||||
process_date: [],
|
||||
due_date: [],
|
||||
payment_date: [],
|
||||
invoice_date: [],
|
||||
internal_reference: [],
|
||||
notes: [],
|
||||
attachments: [],
|
||||
},
|
||||
},
|
||||
budget: transaction.budget_id,
|
||||
tags: transaction.tags,
|
||||
custom_fields: {
|
||||
interest_date: transaction.interest_date,
|
||||
book_date: transaction.book_date,
|
||||
process_date: transaction.process_date,
|
||||
due_date: transaction.due_date,
|
||||
payment_date: transaction.payment_date,
|
||||
invoice_date: transaction.invoice_date,
|
||||
internal_reference: transaction.internal_reference,
|
||||
notes: transaction.notes
|
||||
},
|
||||
foreign_amount: {
|
||||
amount: this.positiveAmount(transaction.foreign_amount),
|
||||
currency_id: transaction.foreign_currency_id
|
||||
},
|
||||
source_account: {
|
||||
id: transaction.source_id,
|
||||
name: transaction.source_name,
|
||||
type: transaction.source_type,
|
||||
// i dont know these
|
||||
currency_id: transaction.currency_id,
|
||||
currency_name: transaction.currency_name,
|
||||
currency_code: transaction.currency_code,
|
||||
currency_decimal_places: transaction.currency_decimal_places,
|
||||
allowed_types: [transaction.source_type]
|
||||
},
|
||||
destination_account: {
|
||||
id: transaction.destination_id,
|
||||
name: transaction.destination_name,
|
||||
type: transaction.destination_type,
|
||||
currency_id: transaction.currency_id,
|
||||
currency_name: transaction.currency_name,
|
||||
currency_code: transaction.currency_code,
|
||||
currency_decimal_places: transaction.currency_decimal_places,
|
||||
allowed_types: [transaction.destination_type]
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Some error.');
|
||||
});
|
||||
},
|
||||
convertData: function () {
|
||||
let data = {
|
||||
'transactions': [],
|
||||
};
|
||||
let tagList = [];
|
||||
let transactionType;
|
||||
let firstSource;
|
||||
let firstDestination;
|
||||
let foreignAmount = null;
|
||||
let foreignCurrency = null;
|
||||
let currentArray;
|
||||
let sourceId;
|
||||
let sourceName;
|
||||
let destId;
|
||||
let destName;
|
||||
let date;
|
||||
|
||||
if (this.transactions.length > 1) {
|
||||
data.group_title = this.group_title;
|
||||
}
|
||||
|
||||
// get transaction type from first transaction
|
||||
transactionType = this.transactionType ? this.transactionType.toLowerCase() : 'invalid';
|
||||
|
||||
// if the transaction type is invalid, might just be that we can deduce it from
|
||||
// the presence of a source or destination account
|
||||
firstSource = this.transactions[0].source_account.type;
|
||||
firstDestination = this.transactions[0].destination_account.type;
|
||||
|
||||
if ('invalid' === transactionType && ['Asset account', 'Loan', 'Debt', 'Mortgage'].includes(firstSource)) {
|
||||
//console.log('Assumed this is a withdrawal.');
|
||||
transactionType = 'withdrawal';
|
||||
}
|
||||
|
||||
if ('invalid' === transactionType && ['Asset account', 'Loan', 'Debt', 'Mortgage'].includes(firstDestination)) {
|
||||
//console.log('Assumed this is a deposit.');
|
||||
transactionType = 'deposit';
|
||||
}
|
||||
|
||||
|
||||
for (let key in this.transactions) {
|
||||
if (this.transactions.hasOwnProperty(key) && /^0$|^[1-9]\d*$/.test(key) && key <= 4294967294) {
|
||||
|
||||
sourceId = this.transactions[key].source_account.id;
|
||||
sourceName = this.transactions[key].source_account.name;
|
||||
destId = this.transactions[key].destination_account.id;
|
||||
destName = this.transactions[key].destination_account.name;
|
||||
|
||||
date = this.transactions[key].date;
|
||||
if (key > 0) {
|
||||
date = this.transactions[0].date;
|
||||
}
|
||||
|
||||
// if type is 'withdrawal' and destination is empty, cash withdrawal.
|
||||
if (transactionType === 'withdrawal' && '' === destName) {
|
||||
destId = window.cashAccountId;
|
||||
}
|
||||
|
||||
// if type is 'deposit' and source is empty, cash deposit.
|
||||
if (transactionType === 'deposit' && '' === sourceName) {
|
||||
sourceId = window.cashAccountId;
|
||||
}
|
||||
|
||||
// if key is over 0 and type is withdrawal or transfer, take source from key 0.
|
||||
if (key > 0 && (transactionType.toLowerCase() === 'withdrawal' || transactionType.toLowerCase() === 'transfer')) {
|
||||
sourceId = this.transactions[0].source_account.id;
|
||||
sourceName = this.transactions[0].source_account.name;
|
||||
}
|
||||
|
||||
// if key is over 0 and type is deposit or transfer, take destination from key 0.
|
||||
if (key > 0 && (transactionType.toLowerCase() === 'deposit' || transactionType.toLowerCase() === 'transfer')) {
|
||||
destId = this.transactions[0].destination_account.id;
|
||||
destName = this.transactions[0].destination_account.name;
|
||||
}
|
||||
|
||||
tagList = [];
|
||||
foreignAmount = null;
|
||||
foreignCurrency = null;
|
||||
// loop tags
|
||||
for (let tagKey in this.transactions[key].tags) {
|
||||
if (this.transactions[key].tags.hasOwnProperty(tagKey) && /^0$|^[1-9]\d*$/.test(tagKey) && key <= 4294967294) {
|
||||
tagList.push(this.transactions[key].tags[tagKey].text);
|
||||
}
|
||||
}
|
||||
|
||||
// set foreign currency info:
|
||||
if (this.transactions[key].foreign_amount.amount !== '' && parseFloat(this.transactions[key].foreign_amount.amount) !== .00) {
|
||||
foreignAmount = this.transactions[key].foreign_amount.amount;
|
||||
foreignCurrency = this.transactions[key].foreign_amount.currency_id;
|
||||
}
|
||||
if (foreignCurrency === this.transactions[key].currency_id) {
|
||||
foreignAmount = null;
|
||||
foreignCurrency = null;
|
||||
}
|
||||
|
||||
// correct some id's
|
||||
if (0 === destId) {
|
||||
destId = null;
|
||||
}
|
||||
if (0 === sourceId) {
|
||||
sourceId = null;
|
||||
}
|
||||
|
||||
currentArray =
|
||||
{
|
||||
type: transactionType,
|
||||
date: date,
|
||||
|
||||
amount: this.transactions[key].amount,
|
||||
currency_id: this.transactions[key].currency_id,
|
||||
|
||||
description: this.transactions[key].description,
|
||||
|
||||
source_id: sourceId,
|
||||
source_name: sourceName,
|
||||
|
||||
destination_id: destId,
|
||||
destination_name: destName,
|
||||
|
||||
|
||||
category_name: this.transactions[key].category,
|
||||
//budget_id: this.transactions[key].budget,
|
||||
//piggy_bank_id: this.transactions[key].piggy_bank,
|
||||
|
||||
|
||||
interest_date: this.transactions[key].custom_fields.interest_date,
|
||||
book_date: this.transactions[key].custom_fields.book_date,
|
||||
process_date: this.transactions[key].custom_fields.process_date,
|
||||
due_date: this.transactions[key].custom_fields.due_date,
|
||||
payment_date: this.transactions[key].custom_fields.payment_date,
|
||||
invoice_date: this.transactions[key].custom_fields.invoice_date,
|
||||
internal_reference: this.transactions[key].custom_fields.internal_reference,
|
||||
notes: this.transactions[key].custom_fields.notes
|
||||
};
|
||||
|
||||
if (tagList.length > 0) {
|
||||
currentArray.tags = tagList;
|
||||
}
|
||||
if (null !== foreignAmount) {
|
||||
currentArray.foreign_amount = foreignAmount;
|
||||
currentArray.foreign_currency_id = foreignCurrency;
|
||||
}
|
||||
// set budget id and piggy ID.
|
||||
if (parseInt(this.transactions[key].budget) > 0) {
|
||||
currentArray.budget_id = parseInt(this.transactions[key].budget);
|
||||
}
|
||||
if (parseInt(this.transactions[key].piggy_bank) > 0) {
|
||||
currentArray.piggy_bank_id = parseInt(this.transactions[key].piggy_bank);
|
||||
}
|
||||
|
||||
data.transactions.push(currentArray);
|
||||
}
|
||||
}
|
||||
//console.log(data);
|
||||
|
||||
return data;
|
||||
},
|
||||
submit: function (e) {
|
||||
console.log('I am submit');
|
||||
const page = window.location.href.split('/');
|
||||
const groupId = page[page.length - 1];
|
||||
const uri = './api/v1/transactions/' + groupId + '?_token=' + document.head.querySelector('meta[name="csrf-token"]').content;
|
||||
const data = this.convertData();
|
||||
|
||||
let button = $(e.currentTarget);
|
||||
button.prop("disabled", true);
|
||||
|
||||
axios.put(uri, data)
|
||||
.then(response => {
|
||||
if (this.returnAfter) {
|
||||
// do message:
|
||||
this.success_message = '<a href="transactions/show/' + response.data.data.id + '">The transaction</a> has been updated.';
|
||||
this.error_message = '';
|
||||
button.prop("disabled", false);
|
||||
// TODO better
|
||||
if (this.resetFormAfter) {
|
||||
this.getGroup();
|
||||
}
|
||||
|
||||
} else {
|
||||
window.location.href = 'transactions/show/' + response.data.data.id + '?message=updated';
|
||||
}
|
||||
}).catch(error => {
|
||||
// give user errors things back.
|
||||
// something something render errors.
|
||||
this.parseErrors(error.response.data);
|
||||
// something.
|
||||
button.prop("disabled", false);
|
||||
});
|
||||
if (e) {
|
||||
e.preventDefault();
|
||||
}
|
||||
},
|
||||
addTransaction: function (e) {
|
||||
this.transactions.push({
|
||||
description: "",
|
||||
date: "",
|
||||
amount: "",
|
||||
category: "",
|
||||
piggy_bank: 0,
|
||||
errors: {
|
||||
source_account: [],
|
||||
destination_account: [],
|
||||
description: [],
|
||||
amount: [],
|
||||
date: [],
|
||||
budget_id: [],
|
||||
foreign_amount: [],
|
||||
category: [],
|
||||
piggy_bank: [],
|
||||
tags: [],
|
||||
// custom fields:
|
||||
custom_errors: {
|
||||
interest_date: [],
|
||||
book_date: [],
|
||||
process_date: [],
|
||||
due_date: [],
|
||||
payment_date: [],
|
||||
invoice_date: [],
|
||||
internal_reference: [],
|
||||
notes: [],
|
||||
attachments: [],
|
||||
},
|
||||
},
|
||||
budget: 0,
|
||||
tags: [],
|
||||
custom_fields: {
|
||||
"interest_date": "",
|
||||
"book_date": "",
|
||||
"process_date": "",
|
||||
"due_date": "",
|
||||
"payment_date": "",
|
||||
"invoice_date": "",
|
||||
"internal_reference": "",
|
||||
"notes": "",
|
||||
"attachments": []
|
||||
},
|
||||
foreign_amount: {
|
||||
amount: "",
|
||||
currency_id: 0
|
||||
},
|
||||
source_account: {
|
||||
id: 0,
|
||||
name: "",
|
||||
type: "",
|
||||
currency_id: 0,
|
||||
currency_name: '',
|
||||
currency_code: '',
|
||||
currency_decimal_places: 2,
|
||||
allowed_types: []
|
||||
},
|
||||
destination_account: {
|
||||
id: 0,
|
||||
name: "",
|
||||
type: "",
|
||||
currency_id: 0,
|
||||
currency_name: '',
|
||||
currency_code: '',
|
||||
currency_decimal_places: 2,
|
||||
allowed_types: []
|
||||
}
|
||||
});
|
||||
if (e) {
|
||||
e.preventDefault();
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
data() {
|
||||
return {
|
||||
group: this.groupId,
|
||||
error_message: "",
|
||||
success_message: "",
|
||||
transactions: [],
|
||||
group_title: "",
|
||||
returnAfter: false,
|
||||
transactionType: null,
|
||||
group_title_errors: [],
|
||||
resetButtonDisabled: true,
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
@ -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',
|
||||
|
@ -6,6 +6,8 @@
|
||||
|
||||
{% block content %}
|
||||
|
||||
{# TODO attachments #}
|
||||
|
||||
<create-transaction></create-transaction>
|
||||
|
||||
|
||||
|
288
resources/views/v1/transactions/edit.twig
Normal file
288
resources/views/v1/transactions/edit.twig
Normal file
@ -0,0 +1,288 @@
|
||||
{% extends "./layout/default" %}
|
||||
|
||||
{% block breadcrumbs %}
|
||||
{{ Breadcrumbs.render(Route.getCurrentRoute.getName, transactionGroup) }}
|
||||
<edit-transaction></edit-transaction>
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
{#
|
||||
<form method="POST" action="{{ route('transactions.update',journal.id) }}" accept-charset="UTF-8" class="form-horizontal" id="update"
|
||||
enctype="multipart/form-data">
|
||||
|
||||
<input name="_token" type="hidden" value="{{ csrf_token() }}">
|
||||
<input type="hidden" name="id" value="{{ journal.id }}"/>
|
||||
<input type="hidden" name="what" value="{{ what }}"/>
|
||||
|
||||
{% if errors.all|length > 0 %}
|
||||
<div class="row">
|
||||
<div class="col-lg-12">
|
||||
<h3 class="text-danger">{{ 'errors'|_ }}</h3>
|
||||
<ul>
|
||||
{% for err in errors.all %}
|
||||
<li class="text-danger">{{ err }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-6 col-md-6 col-sm-12 col-xs-12">
|
||||
<div class="box box-primary">
|
||||
<div class="box-header with-border">
|
||||
<h3 class="box-title">{{ 'mandatoryFields'|_ }}</h3>
|
||||
</div>
|
||||
<div class="box-body">
|
||||
|
||||
<!-- ALWAYS AVAILABLE -->
|
||||
{{ ExpandedForm.text('description',journal.description) }}
|
||||
|
||||
<!-- SELECTABLE SOURCE ACCOUNT ONLY FOR WITHDRAWALS AND TRANSFERS -->
|
||||
{% if what == 'transfer' or what == 'withdrawal' %}
|
||||
{{ ExpandedForm.longAccountList('source_id', data.source_id, {label: trans('form.asset_source_account')}) }}
|
||||
{% endif %}
|
||||
|
||||
<!-- FREE FORMAT SOURCE ACCOUNT ONLY FOR DEPOSITS -->
|
||||
{% if what == 'deposit' %}
|
||||
{{ ExpandedForm.text('source_name',data.source_name, {label: trans('form.revenue_account')}) }}
|
||||
{% endif %}
|
||||
|
||||
<!-- FREE FORMAT DESTINATION ACCOUNT ONLY FOR EXPENSES -->
|
||||
{% if what == 'withdrawal' %}
|
||||
{{ ExpandedForm.text('destination_name',data.destination_name, {label: trans('form.expense_account')}) }}
|
||||
{% endif %}
|
||||
|
||||
<!-- SELECTABLE DESTINATION ACCOUNT ONLY FOR TRANSFERS AND DEPOSITS -->
|
||||
{% if what == 'transfer' or what == 'deposit' %}
|
||||
{{ ExpandedForm.longAccountList('destination_id', data.destination_id, {label: trans('form.asset_destination_account')} ) }}
|
||||
{% endif %}
|
||||
|
||||
<!-- ALWAYS SHOW AMOUNT -->
|
||||
{{ ExpandedForm.amount('amount',data.amount, {'currency' : data.currency}) }}
|
||||
|
||||
<!-- INSTRUCTIONS FOR EXCHANGE RATES -->
|
||||
{{ ExpandedForm.staticText('exchange_rate_instruction','(here be text)') }}
|
||||
|
||||
{{ ExpandedForm.nonSelectableAmount('native_amount', data.native_amount, {currency: data.native_currency}) }}
|
||||
|
||||
{{ ExpandedForm.nonSelectableAmount('source_amount', data.source_amount, {currency: data.source_currency }) }}
|
||||
|
||||
{{ ExpandedForm.nonSelectableAmount('destination_amount', data.destination_amount, {currency: data.destination_currency }) }}
|
||||
|
||||
<!-- ALWAYS SHOW DATE -->
|
||||
{{ ExpandedForm.date('date',data['date']) }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="col-lg-6 col-md-6 col-sm-12 col-xs-12">
|
||||
<div class="box">
|
||||
<div class="box-header with-border">
|
||||
<h3 class="box-title">{{ 'optionalFields'|_ }}</h3>
|
||||
</div>
|
||||
<div class="box-body">
|
||||
{% if what == 'withdrawal' %}
|
||||
{% if budgetList|length > 1 %}
|
||||
{{ ExpandedForm.select('budget_id', budgetList, data['budget_id']) }}
|
||||
{% else %}
|
||||
{{ ExpandedForm.select('budget_id', budgetList, data['budget_id'], {helpText: trans('firefly.no_budget_pointer', {link: route('budgets.index')})}) }}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{{ ExpandedForm.text('category',data['category']) }}
|
||||
{{ ExpandedForm.text('tags') }}
|
||||
|
||||
{% if data.bill_id != null %}
|
||||
{{ ExpandedForm.checkbox('keep_bill_id',1,true, {'helpText': trans('firefly.journal_link_bill', {name: data.bill_name,route: route('bills.show', [data.bill_id])})} ) }}
|
||||
{% endif %}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
{% if
|
||||
not optionalFields.interest_date or
|
||||
not optionalFields.book_date or
|
||||
not optionalFields.process_date or
|
||||
not optionalFields.due_date or
|
||||
not optionalFields.payment_date or
|
||||
not optionalFields.invoice_date or
|
||||
not optionalFields.internal_reference or
|
||||
not optionalFields.notes or
|
||||
not optionalFields.attachments %}
|
||||
<p class="text-center text-success"><i class="fa fa-info-circle"></i>
|
||||
<em>{{ trans('firefly.hidden_fields_preferences', {link: route('preferences.index')})|raw }}</em></p>
|
||||
{% endif %}
|
||||
{% if
|
||||
optionalFields.interest_date or
|
||||
optionalFields.book_date or
|
||||
optionalFields.process_date or
|
||||
optionalFields.due_date or
|
||||
optionalFields.payment_date or
|
||||
optionalFields.invoice_date or
|
||||
data.interest_date or
|
||||
data.book_date or
|
||||
data.process_date or
|
||||
data.due_date or
|
||||
data.payment_date %}
|
||||
<div class="box">
|
||||
<div class="box-header with-border">
|
||||
<h3 class="box-title">{{ 'optional_field_meta_dates'|_ }}</h3>
|
||||
</div>
|
||||
<div class="box-body">
|
||||
|
||||
{% if optionalFields.interest_date or data['interest_date'] %}
|
||||
{{ ExpandedForm.date('interest_date',data['interest_date']) }}
|
||||
{% endif %}
|
||||
|
||||
{% if optionalFields.book_date or data['book_date'] %}
|
||||
{{ ExpandedForm.date('book_date',data['book_date']) }}
|
||||
{% endif %}
|
||||
|
||||
{% if optionalFields.process_date or data['process_date'] %}
|
||||
{{ ExpandedForm.date('process_date',data['process_date']) }}
|
||||
{% endif %}
|
||||
|
||||
{% if optionalFields.due_date or data['due_date'] %}
|
||||
{{ ExpandedForm.date('due_date',data['due_date']) }}
|
||||
{% endif %}
|
||||
|
||||
{% if optionalFields.payment_date or data['payment_date'] %}
|
||||
{{ ExpandedForm.date('payment_date',data['payment_date']) }}
|
||||
{% endif %}
|
||||
|
||||
{% if optionalFields.invoice_date or data['invoice_date'] %}
|
||||
{{ ExpandedForm.date('invoice_date',data['invoice_date']) }}
|
||||
{% endif %}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% if
|
||||
optionalFields.internal_reference or
|
||||
optionalFields.notes or
|
||||
data['interal_reference'] or
|
||||
data['notes'] %}
|
||||
<div class="box">
|
||||
<div class="box-header with-border">
|
||||
<h3 class="box-title">{{ 'optional_field_meta_business'|_ }}</h3>
|
||||
</div>
|
||||
<div class="box-body">
|
||||
{% if optionalFields.internal_reference or data['interal_reference'] %}
|
||||
{{ ExpandedForm.text('internal_reference', data['interal_reference']) }}
|
||||
{% endif %}
|
||||
|
||||
{% if optionalFields.notes or data['notes'] %}
|
||||
{{ ExpandedForm.textarea('notes', data['notes'], {helpText: trans('firefly.field_supports_markdown')}) }}
|
||||
{% endif %}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if optionalFields.attachments or journal.attachments|length > 0 %}
|
||||
<div class="box">
|
||||
<div class="box-header with-border">
|
||||
<h3 class="box-title">{{ 'optional_field_attachments'|_ }}</h3>
|
||||
</div>
|
||||
<div class="box-body">
|
||||
{% if journal.attachments|length > 0 %}
|
||||
<div id="att_holder_attachments" class="form-group">
|
||||
<label class="col-sm-4 control-label">
|
||||
{{ trans('form.existing_attachments') }}
|
||||
</label>
|
||||
<div class="col-sm-8">
|
||||
{% for att in journal.attachments %}
|
||||
<div class="row att_row" data-id="{{ att.id }}">
|
||||
<div class="col-lg-1"><a href="{{ route('attachments.delete', att.id) }}" data-id="{{ att.id }}" class="del_att btn btn-danger btn-xs"><i class="fa fa-trash"></i></a></div>
|
||||
<div class="col-lg-11">
|
||||
<a href="{{ route('attachments.view', att.id) }}" title="{{ att.filename }}">
|
||||
{% if att.title %}
|
||||
{{ att.title }} ({{ att.filename }})
|
||||
{% else %}
|
||||
{{ att.filename }}
|
||||
{% endif %}
|
||||
</a>
|
||||
({{ att.size|filesize }})
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{{ ExpandedForm.file('attachments[]', {'multiple': 'multiple','helpText': trans('firefly.upload_max_file_size', {'size': uploadSize|filesize}) }) }}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<!-- panel for options -->
|
||||
<div class="box">
|
||||
<div class="box-header with-border">
|
||||
<h3 class="box-title">{{ 'options'|_ }}</h3>
|
||||
</div>
|
||||
<div class="box-body">
|
||||
{{ ExpandedForm.optionsList('update','transaction') }}
|
||||
|
||||
<div class="form-group" id="do_split_holder">
|
||||
<label for="ffInput_do_split" class="col-sm-4 control-label">{{ 'do_split'|_ }}</label>
|
||||
|
||||
<div class="col-sm-8">
|
||||
<p class="form-control-static">
|
||||
<a href="{{ route('transactions.split.edit', journal.id) }}">{{ ('split_this_'~what)|_ }}</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="box-footer">
|
||||
<button type="submit" class="pull-right btn btn-success">{{ ('update_' ~ what)|_ }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<input type="hidden" name="source_account_currency" value="0"/>
|
||||
<input type="hidden" name="destination_account_currency" value="0"/>
|
||||
</form>
|
||||
#}
|
||||
|
||||
{% endblock %}
|
||||
{% block scripts %}
|
||||
<script type="text/javascript">
|
||||
var allowedOpposingTypes = {{ allowedOpposingTypes|json_encode|raw }};
|
||||
var accountToTypes = {{ accountToTypes|json_encode|raw }};
|
||||
var defaultCurrency = {{ defaultCurrency.toArray()|json_encode|raw }};
|
||||
var cashAccountId = {{ cash.id }};
|
||||
</script>
|
||||
{#
|
||||
<script type="text/javascript">
|
||||
var what = "{{ what }}";
|
||||
</script>
|
||||
<script type="text/javascript" src="v1/js/lib/typeahead/typeahead.bundle.min.js?v={{ FF_VERSION }}"></script>
|
||||
<script type="text/javascript" src="v1/js/ff/common/autocomplete.js?v={{ FF_VERSION }}"></script>
|
||||
<script type="text/javascript" src="v1/js/lib/bootstrap-tagsinput.min.js?v={{ FF_VERSION }}"></script>
|
||||
<script type="text/javascript" src="v1/js/lib/jquery-ui.min.js?v={{ FF_VERSION }}"></script>
|
||||
<script type="text/javascript" src="v1/js/lib/modernizr-custom.js?v={{ FF_VERSION }}"></script>
|
||||
<script type="text/javascript" src="v1/jscript/accounts?ext=.js&v={{ FF_VERSION }}"></script>
|
||||
<script type="text/javascript" src="v1/jscript/currencies?ext=.js&v={{ FF_VERSION }}"></script>
|
||||
<script type="text/javascript">
|
||||
var journal = {{ journal.toArray()|json_encode|raw }};
|
||||
var journalData = {{ data|json_encode|raw }};
|
||||
var exchangeRateInstructions = "{{ 'exchange_rate_instructions'|_|escape('js') }}";
|
||||
var transferInstructions = "{{ 'transfer_exchange_rate_instructions'|_|escape('js') }}";
|
||||
</script>
|
||||
<script type="text/javascript" src="v1/js/ff/transactions/single/common.js?v={{ FF_VERSION }}"></script>
|
||||
<script type="text/javascript" src="v1/js/ff/transactions/single/edit.js?v={{ FF_VERSION }}"></script>
|
||||
#}
|
||||
{% endblock %}
|
||||
{% block styles %}
|
||||
{#
|
||||
<link href="v1/css/bootstrap-tagsinput.css?v={{ FF_VERSION }}" type="text/css" rel="stylesheet" media="all">
|
||||
<link href="v1/css/jquery-ui/jquery-ui.structure.min.css?v={{ FF_VERSION }}" type="text/css" rel="stylesheet" media="all">
|
||||
<link href="v1/css/jquery-ui/jquery-ui.theme.min.css?v={{ FF_VERSION }}" type="text/css" rel="stylesheet" media="all">
|
||||
#}
|
||||
{% endblock %}
|
@ -19,6 +19,22 @@
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if message == 'updated' %}
|
||||
<div class="row">
|
||||
<div class="col-lg-12">
|
||||
<div class="alert alert-success alert-dismissible" role="alert">
|
||||
<button type="button" class="close" data-dismiss="alert">
|
||||
<span>×</span><span class="sr-only">{{ 'close'|_ }}</span>
|
||||
</button>
|
||||
<strong>{{ 'flash_success'|_ }}</strong>
|
||||
{{ trans('firefly.updated_journal_no_descr') }}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-6">
|
||||
<div class="box box-primary">
|
||||
@ -55,7 +71,9 @@
|
||||
<div class="btn-group btn-group-xs">
|
||||
<a href="{{ route('transactions.edit', [transactionGroup.id]) }}" class="btn btn-default"><i class="fa fa-pencil"></i> {{ 'edit'|_ }}</a>
|
||||
{% if type != 'Opening balance' and type != 'Reconciliation' %}
|
||||
<a href="{{ route('transactions.clone', [transactionGroup.id]) }}" class="btn btn-default"><i class="fa fa-copy"></i> {{ 'clone'|_ }}</a>
|
||||
{#<a href="{{ route('transactions.clone', [transactionGroup.id]) }}" class="btn btn-default"><i class="fa fa-copy"></i> {{ 'clone'|_ }}</a>#}
|
||||
|
||||
{#
|
||||
{% if type != 'Withdrawal' %}
|
||||
<a href="{{ route('transactions.convert', [transactionGroup.id, 'withdrawal']) }}" class="btn btn-default"><i class="fa fa-exchange"></i> {{ 'convert_to_withdrawal'|_ }}</a>
|
||||
{% endif %}
|
||||
@ -65,8 +83,11 @@
|
||||
{% if type != 'Transfer' %}
|
||||
<a href="{{ route('transactions.convert', [transactionGroup.id, 'transfer']) }}" class="btn btn-default"><i class="fa fa-exchange"></i> {{ 'convert_to_transfer'|_ }}</a>
|
||||
{% endif %}
|
||||
#}
|
||||
{% endif %}
|
||||
{#
|
||||
<a href="{{ route('transactions.delete', [transactionGroup.id]) }}" class="btn btn-danger"><i class="fa fa-trash"></i> {{ 'delete'|_ }}</a>
|
||||
#}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -132,25 +153,25 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
</div>
|
||||
<div class="row">
|
||||
|
||||
</div>
|
||||
{% if splits > 1 %}
|
||||
</div>
|
||||
{% if splits > 1 %}
|
||||
<div class="row">
|
||||
<div class="col-lg-12">
|
||||
<h3>{{ 'splits'|_ }}</h3>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% set boxSize=12 %}
|
||||
{% if(splits == 2) %}
|
||||
{% endif %}
|
||||
{% set boxSize=12 %}
|
||||
{% if(splits == 2) %}
|
||||
{% set boxSize=6 %}
|
||||
{% endif %}
|
||||
{% if (splits > 2) %}
|
||||
{% endif %}
|
||||
{% if (splits > 2) %}
|
||||
{% set boxSize = 4 %}
|
||||
{% endif %}
|
||||
<div class="row">
|
||||
{% endif %}
|
||||
<div class="row">
|
||||
{% for index,journal in groupArray.transactions %}
|
||||
<div class="col-lg-{{ boxSize }}">
|
||||
<div class="box">
|
||||
@ -371,12 +392,12 @@
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block scripts %}
|
||||
{% endblock %}
|
||||
|
||||
{#
|
||||
{#
|
||||
|
||||
{% if links.count > 0 %}
|
||||
<div class="box">
|
||||
@ -423,8 +444,8 @@
|
||||
</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-lg-12 col-md-12 col-sm-12">
|
||||
<div class="box">
|
||||
<div class="box-header with-border">
|
||||
@ -499,9 +520,9 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="modal fade" tabindex="-1" role="dialog" id="linkJournalModal">
|
||||
<div class="modal fade" tabindex="-1" role="dialog" id="linkJournalModal">
|
||||
<form action="{{ route('transactions.link.store', [journal.id]) }}" method="post" class="form-horizontal">
|
||||
<input type="hidden" name="_token" value="{{ csrf_token() }}">
|
||||
<div class="modal-dialog modal-lg">
|
||||
@ -548,5 +569,5 @@
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
#}
|
||||
|
@ -1030,10 +1030,14 @@ try {
|
||||
|
||||
Breadcrumbs::register(
|
||||
'transactions.edit',
|
||||
function (BreadcrumbsGenerator $breadcrumbs, TransactionJournal $journal) {
|
||||
$breadcrumbs->parent('transactions.show', $journal);
|
||||
function (BreadcrumbsGenerator $breadcrumbs, TransactionGroup $group) {
|
||||
$breadcrumbs->parent('transactions.show', $group);
|
||||
|
||||
/** @var TransactionJournal $first */
|
||||
$first = $group->transactionJournals()->first();
|
||||
|
||||
$breadcrumbs->push(
|
||||
trans('breadcrumbs.edit_journal', ['description' => limitStringLength($journal->description)]), route('transactions.edit', [$journal->id])
|
||||
trans('breadcrumbs.edit_journal', ['description' => limitStringLength($first->description)]), route('transactions.edit', [$group->id])
|
||||
);
|
||||
}
|
||||
);
|
||||
|
@ -554,7 +554,6 @@ Route::group(
|
||||
Route::get('tags', ['uses' => 'Json\AutoCompleteController@tags', 'as' => 'autocomplete.tags']);
|
||||
|
||||
|
||||
|
||||
// TODO improve 3 routes:
|
||||
//Route::get('transaction-journals/all', ['uses' => 'Json\AutoCompleteController@allTransactionJournals', 'as' => 'all-transaction-journals']);
|
||||
//Route::get('transaction-journals/with-id/{tj}', ['uses' => 'Json\AutoCompleteController@journalsWithId', 'as' => 'journals-with-id']);
|
||||
@ -891,7 +890,16 @@ Route::group(
|
||||
Route::get('create', ['uses' => 'Transaction\CreateController@create', 'as' => 'create']);
|
||||
Route::post('store', ['uses' => 'Transaction\CreateController@store', 'as' => 'store']);
|
||||
|
||||
// edit group
|
||||
Route::get('edit/{transactionGroup}', ['uses' => 'Transaction\EditController@edit', 'as' => 'edit']);
|
||||
Route::post('update', ['uses' => 'Transaction\EditController@update', 'as' => 'update']);
|
||||
|
||||
// delete group
|
||||
Route::get('delete/{transactionGroup}', ['uses' => 'Transaction\DeleteController@delete', 'as' => 'delete']);
|
||||
Route::post('destroy/{transactionGroup}', ['uses' => 'Transaction\DeleteController@destroy', 'as' => 'destroy']);
|
||||
|
||||
// clone group:
|
||||
Route::get('clone/{transactionGroup}', ['uses' => 'Transaction\CloneController@clone', 'as' => 'clone']);
|
||||
|
||||
Route::get('debug/{tj}', ['uses' => 'Transaction\SingleController@debugShow', 'as' => 'debug']);
|
||||
Route::get('debug/{tj}', ['uses' => 'Transaction\SingleController@debugShow', 'as' => 'debug']);
|
||||
@ -913,13 +921,13 @@ Route::group(
|
||||
function () {
|
||||
// TODO improve these routes
|
||||
|
||||
Route::get('edit/{tj}', ['uses' => 'SingleController@edit', 'as' => 'edit']);
|
||||
Route::get('delete/{tj}', ['uses' => 'SingleController@delete', 'as' => 'delete']);
|
||||
//Route::get('edit/{tj}', ['uses' => 'SingleController@edit', 'as' => 'edit']);
|
||||
//
|
||||
//Route::post('store', ['uses' => 'SingleController@store', 'as' => 'store'])->where(['what' => 'withdrawal|deposit|transfer']);
|
||||
Route::post('update/{tj}', ['uses' => 'SingleController@update', 'as' => 'update']);
|
||||
Route::post('destroy/{tj}', ['uses' => 'SingleController@destroy', 'as' => 'destroy']);
|
||||
Route::get('clone/{tj}', ['uses' => 'SingleController@cloneTransaction', 'as' => 'clone']);
|
||||
Route::get('{tj}/{type}', ['uses' => 'ConvertController@index', 'as' => 'convert']);
|
||||
//Route::post('update/{tj}', ['uses' => 'SingleController@update', 'as' => 'update']);
|
||||
//
|
||||
//Route::get('clone/{tj}', ['uses' => 'SingleController@cloneTransaction', 'as' => 'clone']);
|
||||
//Route::get('{tj}/{type}', ['uses' => 'ConvertController@index', 'as' => 'convert']);
|
||||
// TODO end of improvement.
|
||||
}
|
||||
);
|
||||
|
Loading…
Reference in New Issue
Block a user