First attempt at displaying a group.

This commit is contained in:
James Cole
2019-04-08 20:31:31 +02:00
parent c7bf167f81
commit 13afd4582f
8 changed files with 203 additions and 67 deletions

View File

@@ -51,6 +51,8 @@ class AboutController extends Controller
$phpVersion = str_replace($search, $replace, PHP_VERSION);
$phpOs = str_replace($search, $replace, PHP_OS);
$currentDriver = DB::getDriverName();
$data
= [
'version' => config('firefly.version'),

View File

@@ -0,0 +1,79 @@
<?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\Transaction;
use FireflyIII\Http\Controllers\Controller;
use FireflyIII\Models\TransactionGroup;
use FireflyIII\Models\TransactionJournal;
use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepositoryInterface;
/**
* Class ShowController
*/
class ShowController extends Controller
{
/** @var TransactionGroupRepositoryInterface */
private $groupRepository;
/**
* SingleController constructor.
*/
public function __construct()
{
parent::__construct();
// some useful repositories:
$this->middleware(
function ($request, $next) {
$this->groupRepository = app(TransactionGroupRepositoryInterface::class);
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 show(TransactionGroup $transactionGroup)
{
/** @var TransactionJournal $first */
$first = $transactionGroup->transactionJournals->first();
$groupType = $first->transactionType->type;
$description = $transactionGroup->title;
if ($transactionGroup->transactionJournals()->count() > 1) {
$description = $first->description;
}
$subTitle = sprintf('%s: "%s"', $groupType, $description);
return view('transactions.show', compact('transactionGroup', 'subTitle'));
}
}

View File

@@ -23,6 +23,7 @@ declare(strict_types=1);
namespace FireflyIII\Models;
use Carbon\Carbon;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\User;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
@@ -169,9 +170,11 @@ class TransactionJournal extends Model
*
* @return TransactionJournal
* @throws NotFoundHttpException
* @throws FireflyException
*/
public static function routeBinder(string $value): TransactionJournal
{
throw new FireflyException('Journal binder is permanently out of order.');
if (auth()->check()) {
$journalId = (int)$value;
/** @var User $user */

View File

@@ -33,15 +33,28 @@ class ChangesForV450 extends Migration
*/
public function down(): void
{
// split up for sqlite compatibility
Schema::table(
'transactions',
function (Blueprint $table) {
static function (Blueprint $table) {
$table->dropColumn('foreign_amount');
}
);
Schema::table(
'transactions',
static function (Blueprint $table) {
// cannot drop foreign keys in SQLite:
if ('sqlite' !== config('database.default')) {
$table->dropForeign('transactions_foreign_currency_id_foreign');
}
}
);
Schema::table(
'transactions',
static function (Blueprint $table) {
$table->dropColumn('foreign_currency_id');
}
);

View File

@@ -37,19 +37,53 @@ class ChangesForV474 extends Migration
*/
public function down(): void
{
// split up for sqlite compatibility.
Schema::table(
'import_jobs',
function (Blueprint $table) {
static function (Blueprint $table) {
// cannot drop foreign keys in SQLite:
if ('sqlite' !== config('database.default')) {
$table->dropForeign('import_jobs_tag_id_foreign');
}
}
);
Schema::table(
'import_jobs',
static function (Blueprint $table) {
$table->dropColumn('provider');
}
);
Schema::table(
'import_jobs',
static function (Blueprint $table) {
$table->dropColumn('stage');
}
);
Schema::table(
'import_jobs',
static function (Blueprint $table) {
$table->dropColumn('transactions');
}
);
Schema::table(
'import_jobs',
static function (Blueprint $table) {
$table->dropColumn('errors');
}
);
Schema::table(
'import_jobs',
static function (Blueprint $table) {
$table->dropColumn('tag_id');
}
@@ -65,7 +99,7 @@ class ChangesForV474 extends Migration
{
Schema::table(
'import_jobs',
function (Blueprint $table) {
static function (Blueprint $table) {
$table->string('provider', 50)->after('file_type')->default('');
$table->string('stage', 50)->after('status')->default('');
$table->longText('transactions')->after('extended_status')->nullable();

View File

@@ -1,7 +1,7 @@
{% extends "./layout/default" %}
{% block breadcrumbs %}
{{ Breadcrumbs.render(Route.getCurrentRoute.getName, journal) }}
{{ Breadcrumbs.render(Route.getCurrentRoute.getName, transactionGroup) }}
{% endblock %}
{% block content %}
@@ -15,8 +15,8 @@
<button id="transaction_menu" class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i class="fa fa-ellipsis-v"></i>
</button>
<ul class="dropdown-menu" role="menu">
<li><a href="{{ route('transactions.edit',journal.id) }}"><i class="fa fa-pencil fa-fw"></i> {{ 'edit'|_ }}</a></li>
<li><a href="{{ route('transactions.delete',journal.id) }}"><i class="fa fa-trash fa-fw"></i> {{ 'delete'|_ }}</a></li>
<li><a href="edit"><i class="fa fa-pencil fa-fw"></i> {{ 'edit'|_ }}</a></li>
<li><a href="delete"><i class="fa fa-trash fa-fw"></i> {{ 'delete'|_ }}</a></li>
{# convert to withdrawal #}
{% if journal.transactionType.type != "Withdrawal" %}
<li>
@@ -48,7 +48,7 @@
</a>
</li>
<li>
<a href="{{ route('transactions.split.edit', journal.id) }}">
<a href="split">
<i class="fa fa-unsorted fa-fw"></i> {{ ('split_this_'~what)|_ }}
</a>
</li>
@@ -80,39 +80,23 @@
</tr>
<tr>
<td>{{ 'source_accounts'|_ }}</td>
<td>{{ sourceAccount(journal)|raw }}</td>
<td>sources</td>
</tr>
<tr>
<td>{{ 'destination_accounts'|_ }}</td>
<td>{{ destinationAccount(journal)|raw }}</td>
<td>desitnations</td>
</tr>
<tr>
<td>{{ 'total_amount'|_ }}</td>
<td>
{{ journal|journalTotalAmount }}
{# if more transactions, list each one: #}
{% if transactions|length > 2 %}
({% for transaction in transactions %}
{% if transaction.type == 'Deposit' and transaction.amount > 0 %}
{{ transaction|transactionArrayAmount }}{% if loop.index != loop.length %}, {% endif %}
{% endif %}
{% if transaction.type == 'Withdrawal' and transaction.amount < 0 %}
{{ transaction|transactionArrayAmount }}{% if loop.index != loop.length %}, {% endif %}
{% endif %}
{% if transaction.type == 'Transfer' and transaction.amount > 0 %}
{{ transaction|transactionArrayAmount }}{% if loop.index != loop.length %}, {% endif %}
{% endif %}
{% endfor %})
{% endif %}
total amount and splits
</td>
</tr>
<tr>
<td style="width:30%;">{{ trans('list.date') }}</td>
<td>{{ journal.date.formatLocalized(dateTimeFormat) }}</td>
<td>
date
</td>
</tr>
</tbody>
</table>
@@ -120,7 +104,7 @@
<div class="box-footer">
<div class="pull-right">
<div class="btn-group">
<a class="btn btn-default" href="{{ route('transactions.edit',journal.id) }}"><i class="fa fa-pencil fa-fw"></i> {{ 'edit'|_ }}</a>
<a class="btn btn-default" href="#"><i class="fa fa-pencil fa-fw"></i> {{ 'edit'|_ }}</a>
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fa fa-cog fa-fw"></i> {{ 'options'|_ }} <span class="caret"></span>
</button>
@@ -157,7 +141,7 @@
</a>
</li>
<li>
<a href="{{ route('transactions.split.edit', journal.id) }}">
<a href="#">
<i class="fa fa-unsorted fa-fw"></i> {{ ('split_this_'~what)|_ }}
</a>
</li>
@@ -168,7 +152,7 @@
</li>
</ul>
<a href="{{ route('transactions.delete',journal.id) }}" class="btn btn-danger"><i class="fa fa-trash fa-fw"></i> {{ 'delete'|_ }}
<a href="#" class="btn btn-danger"><i class="fa fa-trash fa-fw"></i> {{ 'delete'|_ }}
</a>
</div>
</div>
@@ -197,30 +181,34 @@
<tbody>
<tr>
<td>{{ 'categories'|_ }}</td>
<td>{{ journalCategories(journal)|raw }}</td>
<td>categoris</td>
</tr>
<tr>
<td>{{ 'budgets'|_ }}</td>
<td>{{ journalBudgets(journal)|raw }}</td>
<td>budgets</td>
</tr>
{# all date meta values #}
{% for dateField in ['interest_date','book_date','process_date','due_date','payment_date','invoice_date'] %}
{#
{% if journalHasMeta(journal, dateField) %}
<tr>
<td>{{ trans('list.'~dateField) }}</td>
<td>{{ journalGetMetaDate(journal,dateField).formatLocalized(monthAndDayFormat) }}</td>
</tr>
{% endif %}
#}
{% endfor %}
{# all other meta values #}
{% for metaField in ['external_id','bunq_payment_id','internal_reference','sepa_batch_id','sepa_ct_id','sepa_ct_op','sepa_db','sepa_country','sepa_cc','sepa_ep','sepa_ci'] %}
{#
{% if journalHasMeta(journal, metaField) %}
<tr>
<td>{{ trans('list.'~metaField) }}</td>
<td>{{ journalGetMetaField(journal, metaField) }}</td>
</tr>
{% endif %}
#}
{% endfor %}
{% if journal.notes.count == 1 %}
<tr>

View File

@@ -38,6 +38,7 @@ use FireflyIII\Models\Rule;
use FireflyIII\Models\RuleGroup;
use FireflyIII\Models\Tag;
use FireflyIII\Models\TransactionCurrency;
use FireflyIII\Models\TransactionGroup;
use FireflyIII\Models\TransactionJournal;
use FireflyIII\Models\TransactionJournalLink;
use FireflyIII\Models\TransactionType;
@@ -1061,12 +1062,17 @@ try {
Breadcrumbs::register(
'transactions.show',
function (BreadcrumbsGenerator $breadcrumbs, TransactionJournal $journal) {
$what = strtolower($journal->transactionType->type);
$title = limitStringLength($journal->description);
static function (BreadcrumbsGenerator $breadcrumbs, TransactionGroup $group) {
/** @var TransactionJournal $first */
$first = $group->transactionJournals()->first();
$type = strtolower($first->transactionType->type);
$title = limitStringLength($first->description);
if ($group->transactionJournals()->count() > 1) {
$title = limitStringLength($group->title);
}
$breadcrumbs->parent('transactions.index', $what);
$breadcrumbs->push($title, route('transactions.show', [$journal->id]));
$breadcrumbs->parent('transactions.index', $type);
$breadcrumbs->push($title, route('transactions.show', [$group->id]));
}
);

View File

@@ -548,11 +548,13 @@ Route::group(
// for auto complete
// TODO improve me.
//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']);
//Route::get('transaction-journals/{what}', ['uses' => 'Json\AutoCompleteController@transactionJournals', 'as' => 'transaction-journals']);
// Route::get('transaction-types', ['uses' => 'Json\AutoCompleteController@transactionTypes', 'as' => 'transaction-types']);
// 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']);
Route::get('transaction-journals/{what}', ['uses' => 'Json\AutoCompleteController@transactionJournals', 'as' => 'transaction-journals']);
// TODO end of improvement
Route::get('transaction-types', ['uses' => 'Json\AutoCompleteController@transactionTypes', 'as' => 'transaction-types']);
// boxes
Route::get('box/balance', ['uses' => 'Json\BoxController@balance', 'as' => 'box.balance']);
@@ -871,19 +873,21 @@ Route::group(
Route::group(
['middleware' => 'user-full-auth', 'namespace' => 'FireflyIII\Http\Controllers', 'prefix' => 'transactions', 'as' => 'transactions.'], function () {
// Route::get('{what}/all', ['uses' => 'TransactionController@indexAll', 'as' => 'index.all'])->where(['what' => 'withdrawal|deposit|transfers|transfer']);
// Route::get('{what}/{start_date?}/{end_date?}', ['uses' => 'TransactionController@index', 'as' => 'index'])->where(
// ['what' => 'withdrawal|deposit|transfers|transfer']
// );
// TODO improve these routes
Route::get('{what}/all', ['uses' => 'TransactionController@indexAll', 'as' => 'index.all'])->where(['what' => 'withdrawal|deposit|transfers|transfer']);
Route::get('{what}/{start_date?}/{end_date?}', ['uses' => 'TransactionController@index', 'as' => 'index'])->where(
['what' => 'withdrawal|deposit|transfers|transfer']
);
//Route::get('show/{tj}', ['uses' => 'TransactionController@show', 'as' => 'show']);
//Route::get('debug/{tj}', ['uses' => 'Transaction\SingleController@debugShow', 'as' => 'debug']);
Route::get('debug/{tj}', ['uses' => 'Transaction\SingleController@debugShow', 'as' => 'debug']);
Route::get('debug/{tj}', ['uses' => 'Transaction\SingleController@debugShow', 'as' => 'debug']);
//Route::get('show/{tj}', ['uses' => 'TransactionController@show', 'as' => 'show']);
//Route::get('debug/{tj}', ['uses' => 'Transaction\SingleController@debugShow', 'as' => 'debug']);
Route::post('reorder', ['uses' => 'TransactionController@reorder', 'as' => 'reorder']);
Route::post('reconcile', ['uses' => 'TransactionController@reconcile', 'as' => 'reconcile']);
// TODO end of improvement.
//Route::post('reorder', ['uses' => 'TransactionController@reorder', 'as' => 'reorder']);
//Route::post('reconcile', ['uses' => 'TransactionController@reconcile', 'as' => 'reconcile']);
Route::get('show/{transactionGroup}', ['uses' => 'Transaction\ShowController@show', 'as' => 'show']);
}
);
@@ -893,13 +897,15 @@ Route::group(
Route::group(
['middleware' => 'user-full-auth', 'namespace' => 'FireflyIII\Http\Controllers\Transaction', 'prefix' => 'transactions', 'as' => 'transactions.'],
function () {
// Route::get('create/{what}', ['uses' => 'SingleController@create', 'as' => 'create'])->where(['what' => 'withdrawal|deposit|transfer']);
// Route::get('edit/{tj}', ['uses' => 'SingleController@edit', 'as' => 'edit']);
// Route::get('delete/{tj}', ['uses' => 'SingleController@delete', 'as' => 'delete']);
// Route::post('store/{what}', ['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']);
// TODO improve these routes
Route::get('create/{what}', ['uses' => 'SingleController@create', 'as' => 'create'])->where(['what' => 'withdrawal|deposit|transfer']);
Route::get('edit/{tj}', ['uses' => 'SingleController@edit', 'as' => 'edit']);
Route::get('delete/{tj}', ['uses' => 'SingleController@delete', 'as' => 'delete']);
Route::post('store/{what}', ['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']);
// TODO end of improvement.
}
);
@@ -933,8 +939,10 @@ Route::group(
Route::group(
['middleware' => 'user-full-auth', 'namespace' => 'FireflyIII\Http\Controllers\Transaction', 'prefix' => 'transactions/split',
'as' => 'transactions.split.'], function () {
// Route::get('edit/{tj}', ['uses' => 'SplitController@edit', 'as' => 'edit']);
// Route::post('update/{tj}', ['uses' => 'SplitController@update', 'as' => 'update']);
// TODO improve these routes
Route::get('edit/{tj}', ['uses' => 'SplitController@edit', 'as' => 'edit']);
Route::post('update/{tj}', ['uses' => 'SplitController@update', 'as' => 'update']);
// TODO end of todo.
}
);
@@ -945,8 +953,10 @@ Route::group(
Route::group(
['middleware' => 'user-full-auth', 'namespace' => 'FireflyIII\Http\Controllers\Transaction', 'prefix' => 'transactions/convert',
'as' => 'transactions.convert.'], function () {
// Route::get('{transactionType}/{tj}', ['uses' => 'ConvertController@index', 'as' => 'index']);
// Route::post('{transactionType}/{tj}', ['uses' => 'ConvertController@postIndex', 'as' => 'index.post']);
// TODO improve these routes
Route::get('{transactionType}/{tj}', ['uses' => 'ConvertController@index', 'as' => 'index']);
Route::post('{transactionType}/{tj}', ['uses' => 'ConvertController@postIndex', 'as' => 'index.post']);
// TODO end of todo
}
);
@@ -956,7 +966,8 @@ Route::group(
Route::group(
['middleware' => 'user-full-auth', 'namespace' => 'FireflyIII\Http\Controllers\Transaction', 'prefix' => 'transactions/link', 'as' => 'transactions.link.'],
function () {
//Route::post('store/{tj}', ['uses' => 'LinkController@store', 'as' => 'store']);
// TODO improve this route:
Route::post('store/{tj}', ['uses' => 'LinkController@store', 'as' => 'store']);
Route::get('delete/{journalLink}', ['uses' => 'LinkController@delete', 'as' => 'delete']);
Route::get('switch/{journalLink}', ['uses' => 'LinkController@switchLink', 'as' => 'switch']);