mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-09-24 06:43:23 +00:00
Make sure user interface works for new recurring transactions.
This commit is contained in:
@@ -127,9 +127,10 @@ class EditController extends Controller
|
|||||||
'apply_rules' => $hasOldInput ? (bool)$request->old('apply_rules') : $recurrence->apply_rules,
|
'apply_rules' => $hasOldInput ? (bool)$request->old('apply_rules') : $recurrence->apply_rules,
|
||||||
'deposit_source_id' => $array['transactions'][0]['source_id'],
|
'deposit_source_id' => $array['transactions'][0]['source_id'],
|
||||||
'withdrawal_destination_id' => $array['transactions'][0]['destination_id'],
|
'withdrawal_destination_id' => $array['transactions'][0]['destination_id'],
|
||||||
|
|
||||||
];
|
];
|
||||||
|
|
||||||
|
$array['transactions'][0]['tags'] = implode(',', $array['transactions'][0]['tags']);
|
||||||
|
|
||||||
return view(
|
return view(
|
||||||
'recurring.edit',
|
'recurring.edit',
|
||||||
compact('recurrence', 'array', 'weekendResponses', 'budgets', 'preFilled', 'currentRepType', 'repetitionEnd', 'repetitionEnds')
|
compact('recurrence', 'array', 'weekendResponses', 'budgets', 'preFilled', 'currentRepType', 'repetitionEnd', 'repetitionEnds')
|
||||||
@@ -148,6 +149,7 @@ class EditController extends Controller
|
|||||||
public function update(RecurrenceFormRequest $request, Recurrence $recurrence)
|
public function update(RecurrenceFormRequest $request, Recurrence $recurrence)
|
||||||
{
|
{
|
||||||
$data = $request->getAll();
|
$data = $request->getAll();
|
||||||
|
|
||||||
$this->recurring->update($recurrence, $data);
|
$this->recurring->update($recurrence, $data);
|
||||||
|
|
||||||
$request->session()->flash('success', (string)trans('firefly.updated_recurrence', ['title' => $recurrence->title]));
|
$request->session()->flash('success', (string)trans('firefly.updated_recurrence', ['title' => $recurrence->title]));
|
||||||
|
@@ -68,6 +68,7 @@ class IndexController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* TODO the notes of a recurrence are pretty pointless at this moment.
|
||||||
* Show all recurring transactions.
|
* Show all recurring transactions.
|
||||||
*
|
*
|
||||||
* @param Request $request
|
* @param Request $request
|
||||||
@@ -108,33 +109,4 @@ class IndexController extends Controller
|
|||||||
return view('recurring.index', compact('paginator', 'page', 'pageSize', 'total'));
|
return view('recurring.index', compact('paginator', 'page', 'pageSize', 'total'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Show a single recurring transaction.
|
|
||||||
*
|
|
||||||
* @param Recurrence $recurrence
|
|
||||||
*
|
|
||||||
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
|
|
||||||
* @throws FireflyException
|
|
||||||
*/
|
|
||||||
public function show(Recurrence $recurrence)
|
|
||||||
{
|
|
||||||
/** @var RecurrenceTransformer $transformer */
|
|
||||||
$transformer = app(RecurrenceTransformer::class);
|
|
||||||
$transformer->setParameters(new ParameterBag);
|
|
||||||
|
|
||||||
$array = $transformer->transform($recurrence);
|
|
||||||
$groups = $this->recurring->getTransactions($recurrence);
|
|
||||||
|
|
||||||
// transform dates back to Carbon objects:
|
|
||||||
foreach ($array['recurrence_repetitions'] as $index => $repetition) {
|
|
||||||
foreach ($repetition['occurrences'] as $item => $occurrence) {
|
|
||||||
$array['recurrence_repetitions'][$index]['occurrences'][$item] = new Carbon($occurrence);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$subTitle = (string)trans('firefly.overview_for_recurrence', ['title' => $recurrence->title]);
|
|
||||||
|
|
||||||
return view('recurring.show', compact('recurrence', 'subTitle', 'array', 'groups'));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
96
app/Http/Controllers/Recurring/ShowController.php
Normal file
96
app/Http/Controllers/Recurring/ShowController.php
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* ShowController.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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace FireflyIII\Http\Controllers\Recurring;
|
||||||
|
|
||||||
|
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use FireflyIII\Exceptions\FireflyException;
|
||||||
|
use FireflyIII\Http\Controllers\Controller;
|
||||||
|
use FireflyIII\Models\Recurrence;
|
||||||
|
use FireflyIII\Repositories\Recurring\RecurringRepositoryInterface;
|
||||||
|
use FireflyIII\Support\Http\Controllers\GetConfigurationData;
|
||||||
|
use FireflyIII\Transformers\RecurrenceTransformer;
|
||||||
|
use Symfony\Component\HttpFoundation\ParameterBag;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Class ShowController
|
||||||
|
*/
|
||||||
|
class ShowController extends Controller
|
||||||
|
{
|
||||||
|
use GetConfigurationData;
|
||||||
|
/** @var RecurringRepositoryInterface Recurring repository */
|
||||||
|
private $recurring;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IndexController constructor.
|
||||||
|
* @codeCoverageIgnore
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
|
||||||
|
// translations:
|
||||||
|
$this->middleware(
|
||||||
|
function ($request, $next) {
|
||||||
|
app('view')->share('mainTitleIcon', 'fa-paint-brush');
|
||||||
|
app('view')->share('title', (string)trans('firefly.recurrences'));
|
||||||
|
|
||||||
|
$this->recurring = app(RecurringRepositoryInterface::class);
|
||||||
|
|
||||||
|
return $next($request);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show a single recurring transaction.
|
||||||
|
*
|
||||||
|
* @param Recurrence $recurrence
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
|
||||||
|
* @throws FireflyException
|
||||||
|
*/
|
||||||
|
public function show(Recurrence $recurrence)
|
||||||
|
{
|
||||||
|
/** @var RecurrenceTransformer $transformer */
|
||||||
|
$transformer = app(RecurrenceTransformer::class);
|
||||||
|
$transformer->setParameters(new ParameterBag);
|
||||||
|
|
||||||
|
$array = $transformer->transform($recurrence);
|
||||||
|
$groups = $this->recurring->getTransactions($recurrence);
|
||||||
|
|
||||||
|
// transform dates back to Carbon objects:
|
||||||
|
foreach ($array['repetitions'] as $index => $repetition) {
|
||||||
|
foreach ($repetition['occurrences'] as $item => $occurrence) {
|
||||||
|
$array['repetitions'][$index]['occurrences'][$item] = new Carbon($occurrence);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$subTitle = (string)trans('firefly.overview_for_recurrence', ['title' => $recurrence->title]);
|
||||||
|
|
||||||
|
return view('recurring.show', compact('recurrence', 'subTitle', 'array', 'groups'));
|
||||||
|
}
|
||||||
|
}
|
@@ -86,15 +86,11 @@ class RecurrenceFormRequest extends Request
|
|||||||
'budget_name' => null,
|
'budget_name' => null,
|
||||||
'category_id' => null,
|
'category_id' => null,
|
||||||
'category_name' => $this->string('category'),
|
'category_name' => $this->string('category'),
|
||||||
|
|
||||||
],
|
|
||||||
],
|
|
||||||
'meta' => [
|
|
||||||
// tags and piggy bank ID.
|
|
||||||
'tags' => '' !== $this->string('tags') ? explode(',', $this->string('tags')) : [],
|
'tags' => '' !== $this->string('tags') ? explode(',', $this->string('tags')) : [],
|
||||||
'piggy_bank_id' => $this->integer('piggy_bank_id'),
|
'piggy_bank_id' => $this->integer('piggy_bank_id'),
|
||||||
'piggy_bank_name' => null,
|
'piggy_bank_name' => null,
|
||||||
],
|
],
|
||||||
|
],
|
||||||
'repetitions' => [
|
'repetitions' => [
|
||||||
[
|
[
|
||||||
'type' => $repetitionData['type'],
|
'type' => $repetitionData['type'],
|
||||||
@@ -137,86 +133,6 @@ class RecurrenceFormRequest extends Request
|
|||||||
return $return;
|
return $return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Configure the validator instance with special rules for after the basic validation rules.
|
|
||||||
*
|
|
||||||
* @param Validator $validator
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function withValidator(Validator $validator): void
|
|
||||||
{
|
|
||||||
$validator->after(
|
|
||||||
function (Validator $validator) {
|
|
||||||
// validate all account info
|
|
||||||
$this->validateAccountInformation($validator);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Validates the given account information. Switches on given transaction type.
|
|
||||||
*
|
|
||||||
* @param Validator $validator
|
|
||||||
* @throws FireflyException
|
|
||||||
*/
|
|
||||||
public function validateAccountInformation(Validator $validator): void
|
|
||||||
{
|
|
||||||
Log::debug('Now in validateAccountInformation()');
|
|
||||||
/** @var AccountValidator $accountValidator */
|
|
||||||
$accountValidator = app(AccountValidator::class);
|
|
||||||
$data = $validator->getData();
|
|
||||||
$transactionType = $data['transaction_type'] ?? 'invalid';
|
|
||||||
|
|
||||||
$accountValidator->setTransactionType($transactionType);
|
|
||||||
|
|
||||||
// default values:
|
|
||||||
$sourceId = null;
|
|
||||||
$destinationId = null;
|
|
||||||
|
|
||||||
switch ($this->string('transaction_type')) {
|
|
||||||
default:
|
|
||||||
throw new FireflyException(sprintf('Cannot handle transaction type "%s"', $this->string('transaction_type'))); // @codeCoverageIgnore
|
|
||||||
case 'withdrawal':
|
|
||||||
$sourceId = (int)$data['source_id'];
|
|
||||||
$destinationId = (int)$data['withdrawal_destination_id'];
|
|
||||||
break;
|
|
||||||
case 'deposit':
|
|
||||||
$sourceId = (int)$data['deposit_source_id'];
|
|
||||||
$destinationId = (int)$data['destination_id'];
|
|
||||||
break;
|
|
||||||
case 'transfer':
|
|
||||||
$sourceId = (int)$data['source_id'];
|
|
||||||
$destinationId = (int)$data['destination_id'];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// validate source account.
|
|
||||||
$validSource = $accountValidator->validateSource($sourceId, null);
|
|
||||||
|
|
||||||
// do something with result:
|
|
||||||
if (false === $validSource) {
|
|
||||||
$message = (string)trans('validation.generic_invalid_source');
|
|
||||||
$validator->errors()->add('source_id', $message);
|
|
||||||
$validator->errors()->add('deposit_source_id', $message);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// validate destination account
|
|
||||||
$validDestination = $accountValidator->validateDestination($destinationId, null);
|
|
||||||
// do something with result:
|
|
||||||
if (false === $validDestination) {
|
|
||||||
$message = (string)trans('validation.generic_invalid_destination');
|
|
||||||
$validator->errors()->add('destination_id', $message);
|
|
||||||
$validator->errors()->add('withdrawal_destination_id', $message);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The rules for this request.
|
* The rules for this request.
|
||||||
*
|
*
|
||||||
@@ -310,6 +226,86 @@ class RecurrenceFormRequest extends Request
|
|||||||
return $rules;
|
return $rules;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates the given account information. Switches on given transaction type.
|
||||||
|
*
|
||||||
|
* @param Validator $validator
|
||||||
|
*
|
||||||
|
* @throws FireflyException
|
||||||
|
*/
|
||||||
|
public function validateAccountInformation(Validator $validator): void
|
||||||
|
{
|
||||||
|
Log::debug('Now in validateAccountInformation()');
|
||||||
|
/** @var AccountValidator $accountValidator */
|
||||||
|
$accountValidator = app(AccountValidator::class);
|
||||||
|
$data = $validator->getData();
|
||||||
|
$transactionType = $data['transaction_type'] ?? 'invalid';
|
||||||
|
|
||||||
|
$accountValidator->setTransactionType($transactionType);
|
||||||
|
|
||||||
|
// default values:
|
||||||
|
$sourceId = null;
|
||||||
|
$destinationId = null;
|
||||||
|
|
||||||
|
switch ($this->string('transaction_type')) {
|
||||||
|
default:
|
||||||
|
throw new FireflyException(sprintf('Cannot handle transaction type "%s"', $this->string('transaction_type'))); // @codeCoverageIgnore
|
||||||
|
case 'withdrawal':
|
||||||
|
$sourceId = (int)$data['source_id'];
|
||||||
|
$destinationId = (int)$data['withdrawal_destination_id'];
|
||||||
|
break;
|
||||||
|
case 'deposit':
|
||||||
|
$sourceId = (int)$data['deposit_source_id'];
|
||||||
|
$destinationId = (int)$data['destination_id'];
|
||||||
|
break;
|
||||||
|
case 'transfer':
|
||||||
|
$sourceId = (int)$data['source_id'];
|
||||||
|
$destinationId = (int)$data['destination_id'];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// validate source account.
|
||||||
|
$validSource = $accountValidator->validateSource($sourceId, null);
|
||||||
|
|
||||||
|
// do something with result:
|
||||||
|
if (false === $validSource) {
|
||||||
|
$message = (string)trans('validation.generic_invalid_source');
|
||||||
|
$validator->errors()->add('source_id', $message);
|
||||||
|
$validator->errors()->add('deposit_source_id', $message);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// validate destination account
|
||||||
|
$validDestination = $accountValidator->validateDestination($destinationId, null);
|
||||||
|
// do something with result:
|
||||||
|
if (false === $validDestination) {
|
||||||
|
$message = (string)trans('validation.generic_invalid_destination');
|
||||||
|
$validator->errors()->add('destination_id', $message);
|
||||||
|
$validator->errors()->add('withdrawal_destination_id', $message);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configure the validator instance with special rules for after the basic validation rules.
|
||||||
|
*
|
||||||
|
* @param Validator $validator
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function withValidator(Validator $validator): void
|
||||||
|
{
|
||||||
|
$validator->after(
|
||||||
|
function (Validator $validator) {
|
||||||
|
// validate all account info
|
||||||
|
$this->validateAccountInformation($validator);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses repetition data.
|
* Parses repetition data.
|
||||||
*
|
*
|
||||||
|
@@ -91,7 +91,7 @@ class RecurrenceUpdateService
|
|||||||
// update all meta data:
|
// update all meta data:
|
||||||
//$this->updateMetaData($recurrence, $data);
|
//$this->updateMetaData($recurrence, $data);
|
||||||
|
|
||||||
if (null !== $data['recurrence']['notes']) {
|
if (isset($data['recurrence']['notes']) && null !== $data['recurrence']['notes']) {
|
||||||
$this->setNoteText($recurrence, $data['recurrence']['notes']);
|
$this->setNoteText($recurrence, $data['recurrence']['notes']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -178,6 +178,8 @@ class RecurrenceTransformer extends AbstractTransformer
|
|||||||
switch ($transactionMeta->name) {
|
switch ($transactionMeta->name) {
|
||||||
default:
|
default:
|
||||||
throw new FireflyException(sprintf('Recurrence transformer cant handle field "%s"', $transactionMeta->name));
|
throw new FireflyException(sprintf('Recurrence transformer cant handle field "%s"', $transactionMeta->name));
|
||||||
|
case 'bill_id':
|
||||||
|
break;
|
||||||
case 'tags':
|
case 'tags':
|
||||||
$array['tags'] = json_decode($transactionMeta->value);
|
$array['tags'] = json_decode($transactionMeta->value);
|
||||||
break;
|
break;
|
||||||
|
@@ -40,6 +40,7 @@ return [
|
|||||||
'lastActivity' => 'Last activity',
|
'lastActivity' => 'Last activity',
|
||||||
'balanceDiff' => 'Balance difference',
|
'balanceDiff' => 'Balance difference',
|
||||||
'matchesOn' => 'Matched on',
|
'matchesOn' => 'Matched on',
|
||||||
|
'other_meta_data' => 'Other meta data',
|
||||||
'account_type' => 'Account type',
|
'account_type' => 'Account type',
|
||||||
'created_at' => 'Created at',
|
'created_at' => 'Created at',
|
||||||
'account' => 'Account',
|
'account' => 'Account',
|
||||||
|
@@ -125,20 +125,10 @@
|
|||||||
{{ ExpandedForm.text('category',array.transactions[0].category_name) }}
|
{{ ExpandedForm.text('category',array.transactions[0].category_name) }}
|
||||||
|
|
||||||
{# TAGS #}
|
{# TAGS #}
|
||||||
{% set tags = '' %}
|
{{ ExpandedForm.text('tags', array.transactions[0].tags) }}
|
||||||
{% set piggyBankId = 0 %}
|
|
||||||
{% for metaValue in array.meta %}
|
|
||||||
{% if metaValue.name == 'tags' %}
|
|
||||||
{% set tags = metaValue.value %}
|
|
||||||
{% endif %}
|
|
||||||
{% if metaValue.name == 'piggy_bank_id' %}
|
|
||||||
{% set piggyBankId = metaValue.value %}
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
{{ ExpandedForm.text('tags', tags) }}
|
|
||||||
|
|
||||||
{# RELATE THIS TRANSFER TO A PIGGY BANK #}
|
{# RELATE THIS TRANSFER TO A PIGGY BANK #}
|
||||||
{{ PiggyBankForm.piggyBankList('piggy_bank_id',piggyBankId) }}
|
{{ PiggyBankForm.piggyBankList('piggy_bank_id',array.transactions[0].piggy_bank_id) }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<!-- basic info -->
|
<!-- basic info -->
|
||||||
<div class="col-lg-8 col-md-12 col-sm-12">
|
<div class="col-lg-8 col-md-12 col-sm-12">
|
||||||
<div class="box">
|
<div class="box">
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
<h3 class="box-title">
|
<h3 class="box-title">
|
||||||
{{ array.title }}
|
{{ array.title }}
|
||||||
|
|
||||||
({{ array.transaction_type }})
|
({{ array.type }})
|
||||||
|
|
||||||
{% if array.active == false %}
|
{% if array.active == false %}
|
||||||
({{ 'inactive'|_|lower }})
|
({{ 'inactive'|_|lower }})
|
||||||
@@ -48,13 +48,13 @@
|
|||||||
<div class="box">
|
<div class="box">
|
||||||
<div class="box-header with-border">
|
<div class="box-header with-border">
|
||||||
<h3 class="box-title">
|
<h3 class="box-title">
|
||||||
{{ ('expected_'~array.transaction_type~'s')|_ }}
|
{{ ('expected_'~array.type~'s')|_ }}
|
||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="box-body">
|
<div class="box-body">
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
{% for rep in array.recurrence_repetitions %}
|
{% for rep in array.repetitions %}
|
||||||
<li>
|
<li>
|
||||||
{{ rep.description }}
|
{{ rep.description }}
|
||||||
{% if rep.repetition_skip == 1 %}
|
{% if rep.repetition_skip == 1 %}
|
||||||
@@ -79,10 +79,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<!-- transactions -->
|
<!-- transactions -->
|
||||||
<div class="col-lg-8 col-md-12 col-sm-12">
|
<div class="col-lg-12 col-md-12 col-sm-12">
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<div class="box-header with-border">
|
<div class="box-header with-border">
|
||||||
<h3 class="box-title">
|
<h3 class="box-title">
|
||||||
@@ -92,12 +92,15 @@
|
|||||||
<div class="box-body no-padding">
|
<div class="box-body no-padding">
|
||||||
<table class="table table-hover sortable">
|
<table class="table table-hover sortable">
|
||||||
<thead>
|
<thead>
|
||||||
|
<tr>
|
||||||
<th data-defaultsign="az">{{ trans('list.description') }}</th>
|
<th data-defaultsign="az">{{ trans('list.description') }}</th>
|
||||||
<th data-defaultsign="az">{{ trans('list.source') }}</th>
|
<th data-defaultsign="az">{{ trans('list.source') }}</th>
|
||||||
<th data-defaultsign="az">{{ trans('list.destination') }}</th>
|
<th data-defaultsign="az">{{ trans('list.destination') }}</th>
|
||||||
<th data-defaultsign="_19">{{ trans('list.amount') }}</th>
|
<th data-defaultsign="_19">{{ trans('list.amount') }}</th>
|
||||||
<th data-defaultsign="az">{{ trans('list.category') }}</th>
|
<th data-defaultsign="az">{{ trans('list.category') }}</th>
|
||||||
<th data-defaultsign="az">{{ trans('list.budget') }}</th>
|
<th data-defaultsign="az">{{ trans('list.budget') }}</th>
|
||||||
|
<th>{{ trans('list.other_meta_data') }}</th>
|
||||||
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for transaction in array.transactions %}
|
{% for transaction in array.transactions %}
|
||||||
@@ -117,77 +120,39 @@
|
|||||||
({{ formatAmountBySymbol(transaction.foreign_amount,transaction.foreign_currency_symbol,transaction.foreign_currency_decimal_places) }})
|
({{ formatAmountBySymbol(transaction.foreign_amount,transaction.foreign_currency_symbol,transaction.foreign_currency_decimal_places) }})
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
<td data-value="{% for meta in transaction.meta %}{% if meta.name == 'category_name' %}{{ meta.category_id }}{% endif %}{% endfor %}">
|
<td data-value="{{ transaction.category_id|default(0) }}">
|
||||||
{% for meta in transaction.meta %}
|
{% if '' != transaction.category_name %}
|
||||||
{% if meta.name == 'category_name' %}
|
<a href="{{ route('categories.show', [transaction.category_id]) }}">
|
||||||
<a href="{{ route('categories.show', [meta.category_id]) }}">
|
{{ transaction.category_name }}
|
||||||
{{ meta.category_name }}
|
|
||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
|
||||||
</td>
|
</td>
|
||||||
<td data-value="{% for meta in transaction.meta %}{% if meta.name == 'budget_id' %}{{ meta.budget_id }}{% endif %}{% endfor %}">
|
<td data-value="{{ transaction.budget_id|default(0) }}">
|
||||||
{% for meta in transaction.meta %}
|
{% if '' != transaction.budget_name %}
|
||||||
{% if meta.name == 'budget_id' %}
|
<a href="{{ route('budgets.show', [transaction.budget_id]) }}">
|
||||||
<a href="{{ route('budgets.show', [meta.budget_id]) }}">
|
{{ transaction.budget_name }}
|
||||||
{{ meta.budget_name }}
|
|
||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- meta data -->
|
|
||||||
{% if array.meta|length > 0 %}
|
|
||||||
<div class="col-lg-4 col-md-12 col-sm-12">
|
|
||||||
<div class="box">
|
|
||||||
<div class="box-header with-border">
|
|
||||||
<h3 class="box-title">
|
|
||||||
{{ 'meta_data'|_ }}
|
|
||||||
</h3>
|
|
||||||
</div>
|
|
||||||
<div class="box-body no-padding">
|
|
||||||
<table class="table table-hover sortable">
|
|
||||||
<thead>
|
|
||||||
<th style="width:30%;" data-defaultsign="az">{{ trans('list.field') }}</th>
|
|
||||||
<th data-defaultsign="az">{{ trans('list.value') }}</th>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for meta in array.meta %}
|
|
||||||
<tr>
|
|
||||||
<td>{{ trans('firefly.recurring_meta_field_'~meta.name) }}</td>
|
|
||||||
<td>
|
<td>
|
||||||
{% if meta.name == 'tags' %}
|
{% if transaction.tags|length > 0 %}
|
||||||
{% for tag in meta.tags %}
|
<p>
|
||||||
<span class="label label-info">{{ tag }}</span>
|
{% for tag in transaction.tags %}
|
||||||
|
<span class="label label-success">{{ tag }}</span>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if meta.name == 'notes' %}
|
{% if 0 != transaction.piggy_bank_id and array.type == 'Transfer' %}
|
||||||
{{ meta.value|markdown }}
|
<a href="{{ route('piggy-banks.show', [transaction.piggy_bank_id]) }}">{{ transaction.piggy_bank_name }}</a>
|
||||||
{% endif %}
|
|
||||||
{% if meta.name == 'bill_id' %}
|
|
||||||
<a href="{{ route('bills.show', [meta.bill_id]) }}">{{ meta.bill_name }}</a>
|
|
||||||
{% endif %}
|
|
||||||
{% if meta.name == 'piggy_bank_id' %}
|
|
||||||
<a href="{{ route('piggy-banks.show', [meta.piggy_bank_id]) }}">{{ meta.piggy_bank_name }}</a>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
|
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<!-- meta data -->
|
<!-- meta data -->
|
||||||
<div class="col-lg-12 col-md-12 col-sm-12">
|
<div class="col-lg-12 col-md-12 col-sm-12">
|
||||||
@@ -203,14 +168,14 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block styles %}
|
{% block styles %}
|
||||||
<link rel="stylesheet" href="v1/css/bootstrap-sortable.css?v={{ FF_VERSION }}" type="text/css" media="all"/>
|
<link rel="stylesheet" href="v1/css/bootstrap-sortable.css?v={{ FF_VERSION }}" type="text/css" media="all"/>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block scripts %}
|
{% block scripts %}
|
||||||
<script type="text/javascript" src="v1/js/lib/bootstrap-sortable.js?v={{ FF_VERSION }}"></script>
|
<script type="text/javascript" src="v1/js/lib/bootstrap-sortable.js?v={{ FF_VERSION }}"></script>
|
||||||
{# required for groups.twig #}
|
{# required for groups.twig #}
|
||||||
<script type="text/javascript" src="v1/js/ff/list/groups.js?v={{ FF_VERSION }}"></script>
|
<script type="text/javascript" src="v1/js/ff/list/groups.js?v={{ FF_VERSION }}"></script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@@ -657,7 +657,7 @@ Route::group(
|
|||||||
|
|
||||||
Route::get('', ['uses' => 'Recurring\IndexController@index', 'as' => 'index']);
|
Route::get('', ['uses' => 'Recurring\IndexController@index', 'as' => 'index']);
|
||||||
|
|
||||||
Route::get('show/{recurrence}', ['uses' => 'Recurring\IndexController@show', 'as' => 'show']);
|
Route::get('show/{recurrence}', ['uses' => 'Recurring\ShowController@show', 'as' => 'show']);
|
||||||
Route::get('create', ['uses' => 'Recurring\CreateController@create', 'as' => 'create']);
|
Route::get('create', ['uses' => 'Recurring\CreateController@create', 'as' => 'create']);
|
||||||
Route::get('edit/{recurrence}', ['uses' => 'Recurring\EditController@edit', 'as' => 'edit']);
|
Route::get('edit/{recurrence}', ['uses' => 'Recurring\EditController@edit', 'as' => 'edit']);
|
||||||
Route::get('delete/{recurrence}', ['uses' => 'Recurring\DeleteController@delete', 'as' => 'delete']);
|
Route::get('delete/{recurrence}', ['uses' => 'Recurring\DeleteController@delete', 'as' => 'delete']);
|
||||||
|
Reference in New Issue
Block a user