diff --git a/app/Api/V1/Controllers/AboutController.php b/app/Api/V1/Controllers/AboutController.php index ed4ec478aa..b8a0a5cb6b 100644 --- a/app/Api/V1/Controllers/AboutController.php +++ b/app/Api/V1/Controllers/AboutController.php @@ -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'), diff --git a/app/Http/Controllers/Transaction/ShowController.php b/app/Http/Controllers/Transaction/ShowController.php new file mode 100644 index 0000000000..b1646f55c1 --- /dev/null +++ b/app/Http/Controllers/Transaction/ShowController.php @@ -0,0 +1,79 @@ +. + */ + +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')); + } + +} \ No newline at end of file diff --git a/app/Models/TransactionJournal.php b/app/Models/TransactionJournal.php index 93acd8b507..3dc91f61c7 100644 --- a/app/Models/TransactionJournal.php +++ b/app/Models/TransactionJournal.php @@ -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 */ diff --git a/database/migrations/2017_06_02_105232_changes_for_v450.php b/database/migrations/2017_06_02_105232_changes_for_v450.php index 39c3ec1c9b..ea9224f416 100644 --- a/database/migrations/2017_06_02_105232_changes_for_v450.php +++ b/database/migrations/2017_06_02_105232_changes_for_v450.php @@ -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'); } ); diff --git a/database/migrations/2018_04_29_174524_changes_for_v474.php b/database/migrations/2018_04_29_174524_changes_for_v474.php index dfa7e722ac..d9c2598cd7 100644 --- a/database/migrations/2018_04_29_174524_changes_for_v474.php +++ b/database/migrations/2018_04_29_174524_changes_for_v474.php @@ -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(); diff --git a/resources/views/v1/transactions/show.twig b/resources/views/v1/transactions/show.twig index dcf934aa4e..43561912c9 100644 --- a/resources/views/v1/transactions/show.twig +++ b/resources/views/v1/transactions/show.twig @@ -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 @@ - {{ 'delete'|_ }} + {{ 'delete'|_ }} @@ -197,30 +181,34 @@ {{ 'categories'|_ }} - {{ journalCategories(journal)|raw }} + categoris {{ 'budgets'|_ }} - {{ journalBudgets(journal)|raw }} + budgets {# all date meta values #} {% for dateField in ['interest_date','book_date','process_date','due_date','payment_date','invoice_date'] %} + {# {% if journalHasMeta(journal, dateField) %} {{ trans('list.'~dateField) }} {{ journalGetMetaDate(journal,dateField).formatLocalized(monthAndDayFormat) }} {% 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) %} {{ trans('list.'~metaField) }} {{ journalGetMetaField(journal, metaField) }} {% endif %} + #} {% endfor %} {% if journal.notes.count == 1 %} diff --git a/routes/breadcrumbs.php b/routes/breadcrumbs.php index 1073669fcc..844bb69ea2 100644 --- a/routes/breadcrumbs.php +++ b/routes/breadcrumbs.php @@ -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])); } ); diff --git a/routes/web.php b/routes/web.php index 56576dc00f..48f0f6f8b1 100644 --- a/routes/web.php +++ b/routes/web.php @@ -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']); @@ -564,7 +566,7 @@ Route::group( Route::get('trigger', ['uses' => 'JsonController@trigger', 'as' => 'trigger']); Route::get('action', ['uses' => 'JsonController@action', 'as' => 'action']); - // frontpage + // front page Route::get('frontpage/piggy-banks', ['uses' => 'Json\FrontpageController@piggyBanks', 'as' => 'fp.piggy-banks']); // currency conversion: @@ -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']);