From 9c05779fbd4755922603942cae067b6d5eb53d71 Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Wed, 21 Aug 2024 13:42:55 +0700 Subject: [PATCH] Feature #14 : Dokumen Jaminan --- app/Http/Controllers/DebitureController.php | 181 ++++++++++++- app/Http/Requests/DebitureRequest.php | 5 +- app/Http/Requests/DokumenJaminanRequest.php | 42 +++ app/Models/Debiture.php | 1 - app/Models/DokumenJaminan.php | 69 +++++ ...24_08_12_022026_create_debitures_table.php | 8 +- ...20_090400_create_dokumen_jaminan_table.php | 54 ++++ .../debitur/components/debitur.blade.php | 206 +++++++++++++++ .../debitur/components/dokumen.blade.php | 243 ++++++++++++++++++ .../debitur/components/jaminan.blade.php | 162 ++++++++++++ .../debitur/components/pemilik.blade.php | 0 resources/views/debitur/create.blade.php | 243 +----------------- resources/views/debitur/edit.blade.php | 29 +++ resources/views/debitur/jaminan.blade.php | 24 ++ routes/breadcrumbs.php | 19 +- routes/web.php | 13 +- 16 files changed, 1052 insertions(+), 247 deletions(-) create mode 100644 app/Http/Requests/DokumenJaminanRequest.php create mode 100644 app/Models/DokumenJaminan.php create mode 100644 database/migrations/2024_08_20_090400_create_dokumen_jaminan_table.php create mode 100644 resources/views/debitur/components/debitur.blade.php create mode 100644 resources/views/debitur/components/dokumen.blade.php create mode 100644 resources/views/debitur/components/jaminan.blade.php create mode 100644 resources/views/debitur/components/pemilik.blade.php create mode 100644 resources/views/debitur/edit.blade.php create mode 100644 resources/views/debitur/jaminan.blade.php diff --git a/app/Http/Controllers/DebitureController.php b/app/Http/Controllers/DebitureController.php index e1c5432..03b8b49 100644 --- a/app/Http/Controllers/DebitureController.php +++ b/app/Http/Controllers/DebitureController.php @@ -12,8 +12,13 @@ use Modules\Location\Models\Village; use Modules\Lpj\Exports\DebitureExport; use Modules\Lpj\Http\Requests\DebitureRequest; + use Modules\Lpj\Http\Requests\DokumenJaminanRequest; use Modules\Lpj\Models\Branch; use Modules\Lpj\Models\Debiture; + use Modules\Lpj\Models\DokumenJaminan; + use Modules\Lpj\Models\JenisJaminan; + use Modules\Lpj\Models\JenisLegalitasJaminan; + use Modules\Lpj\Models\PemilikJaminan; class DebitureController extends Controller { @@ -52,13 +57,162 @@ public function edit($id) { - $debitur = Debiture::find($id); - $branches = Branch::all(); + $debitur = Debiture::find($id); + $branches = Branch::all(); $provinces = Province::all(); - $cities = City::where('province_code', $debitur->province_code)->get(); + $cities = City::where('province_code', $debitur->province_code)->get(); $districts = District::where('city_code', $debitur->city_code)->get(); - $villages = Village::where('district_code', $debitur->district_code)->get(); - return view('lpj::debitur.create', compact('debitur', 'branches', 'provinces', 'cities', 'districts', 'villages')); + $villages = Village::where('district_code', $debitur->district_code)->get(); + return view( + 'lpj::debitur.edit', + compact('debitur', 'branches', 'provinces', 'cities', 'districts', 'villages'), + ); + } + + public function jaminan($id) + { + $debitur = Debiture::find($id); + $documents = DokumenJaminan::with('pemilik')->where('debiture_id', $id)->get(); + + return view( + 'lpj::debitur.edit', + compact('debitur', 'documents'), + ); + } + + public function createJaminan($id) + { + $debitur = Debiture::find($id); + $provinces = Province::all(); + $jenisJaminan = JenisJaminan::all(); + $jenisLegalitasJaminan = JenisLegalitasJaminan::all(); + + return view( + 'lpj::debitur.jaminan', + compact('debitur', 'provinces', 'jenisJaminan', 'jenisLegalitasJaminan'), + ); + } + + public function storeJaminan(DokumenJaminanRequest $request, $id) + { + $debitur = Debiture::find($id); + + $validate = $request->validated(); + if ($validate) { + try { + $validate['debiture_id'] = $id; + + if ($validate['pemilik_jaminan_id'] == 0) { + $pemilik_jaminan = [ + 'npwp' => $debitur->npwp, + 'email' => $debitur->email, + 'phone' => $debitur->phone, + 'province_code' => $debitur->province_code, + 'city_code' => $debitur->city_code, + 'district_code' => $debitur->district_code, + 'village_code' => $debitur->village_code, + 'postal_code' => $debitur->postal_code, + 'address' => $debitur->address, + ]; + + $pemilikJaminan = PemilikJaminan::updateOrCreate([ + 'debiture_id' => $id, + 'name' => $debitur->name, + ], $pemilik_jaminan); + } + + if ($request->hasFile('dokumen_jaminan')) { + $file = $request->file('dokumen_jaminan'); + $file_name = $file->getClientOriginalName(); + $file->storeAs('public/jaminan/' . $debitur->id, $file_name); + $validate['dokumen_jaminan'] = 'jaminan/' . $debitur->id . '/' . $file_name; + } + + $validate['pemilik_jaminan_id'] = $pemilikJaminan->id; + DokumenJaminan::create($validate); + + + return redirect()->route('debitur.jaminan', $id); + } catch (Exception $e) { + print_r($e->getMessage()); + exit; + } + } + } + + public function updateJaminan(DokumenJaminanRequest $request, $id, $jaminan) + { + $debitur = Debiture::find($id); + + $validate = $request->validated(); + if ($validate) { + try { + $validate['debiture_id'] = $id; + + if ($validate['pemilik_jaminan_id'] == 0) { + $pemilik_jaminan = [ + 'npwp' => $debitur->npwp, + 'email' => $debitur->email, + 'phone' => $debitur->phone, + 'province_code' => $debitur->province_code, + 'city_code' => $debitur->city_code, + 'district_code' => $debitur->district_code, + 'village_code' => $debitur->village_code, + 'postal_code' => $debitur->postal_code, + 'address' => $debitur->address, + ]; + + $pemilikJaminan = PemilikJaminan::updateOrCreate([ + 'debiture_id' => $id, + 'name' => $debitur->name, + ], $pemilik_jaminan); + } + + if ($request->hasFile('dokumen_jaminan')) { + $file = $request->file('dokumen_jaminan'); + $file_name = $file->getClientOriginalName(); + $file->storeAs('public/jaminan/' . $debitur->id, $file_name); + $validate['dokumen_jaminan'] = 'jaminan/' . $debitur->id . '/' . $file_name; + } + + $document = DokumenJaminan::find($jaminan); + $document->update($validate); + + + return redirect()->route('debitur.jaminan', $id); + } catch (Exception $e) { + print_r($e->getMessage()); + exit; + } + } + } + + public function editJaminan($id, $jaminan) + { + $document = DokumenJaminan::find($jaminan); + $debitur = Debiture::find($document->debiture_id); + $provinces = Province::all(); + $cities = City::where('province_code', $document->province_code)->get(); + $districts = District::where('city_code', $document->city_code)->get(); + $villages = Village::where('district_code', $document->district_code)->get(); + $jenisJaminan = JenisJaminan::all(); + $jenisLegalitasJaminan = JenisLegalitasJaminan::all(); + $pemilikJaminan = PemilikJaminan::all(); + + return view( + 'lpj::debitur.jaminan', + compact( + 'debitur', + 'provinces', + 'jenisJaminan', + 'jenisLegalitasJaminan', + 'document', + 'cities', + 'districts', + 'villages', + 'pemilikJaminan', + ), + ); } public function update(DebitureRequest $request, $id) @@ -94,6 +248,17 @@ } } + public function destroyJaminan($id, $jaminan_id) + { + try { + $jaminan = DokumenJaminan::find($jaminan_id); + $jaminan->delete(); + echo json_encode(['success' => true, 'message' => 'Dokumen Jaminan deleted successfully']); + } catch (Exception $e) { + echo json_encode(['success' => false, 'message' => 'Failed to delete Dokumen Jaminan']); + } + } + public function dataForDatatables(Request $request) { if (is_null($this->user) || !$this->user->can('debitur.view')) { @@ -166,4 +331,10 @@ { return Excel::download(new DebitureExport, 'debitur.xlsx'); } + + public function download($id) + { + $document = DokumenJaminan::find($id); + return response()->download(storage_path('app/public/' . $document->dokumen_jaminan)); + } } diff --git a/app/Http/Requests/DebitureRequest.php b/app/Http/Requests/DebitureRequest.php index 1a71510..ff87263 100644 --- a/app/Http/Requests/DebitureRequest.php +++ b/app/Http/Requests/DebitureRequest.php @@ -22,7 +22,6 @@ 'name' => 'required', 'registered_at' => 'nullable|date', 'npwp' => 'nullable|string|max:16', - 'nomor_id' => 'nullable|string|max:16', 'email' => 'nullable|email', 'phone' => 'nullable|string|max:15', 'address' => 'nullable|string', @@ -31,9 +30,9 @@ ]; if ($this->method() == 'PUT') { - $rules['cif'] = 'required|unique:debitures,cif,' . $this->id; + $rules['cif'] = 'nullable|unique:debitures,cif,' . $this->id; } else { - $rules['cif'] = 'required|unique:debitures,cif'; + $rules['cif'] = 'nullable|unique:debitures,cif'; } return $rules; diff --git a/app/Http/Requests/DokumenJaminanRequest.php b/app/Http/Requests/DokumenJaminanRequest.php new file mode 100644 index 0000000..0fa33d6 --- /dev/null +++ b/app/Http/Requests/DokumenJaminanRequest.php @@ -0,0 +1,42 @@ + 'required', + 'jenis_jaminan_id' => 'required', + 'jenis_legalitas_jaminan_id' => 'required', + 'dokumen_jaminan' => 'nullable|file|mimes:pdf', + 'keterangan' => 'nullable|string|max:255', + 'province_code' => 'nullable|exists:provinces,code', + 'city_code' => 'nullable|exists:cities,code', + 'district_code' => 'nullable|exists:districts,code', + 'village_code' => 'nullable|exists:villages,code', + 'name' => 'required', + 'address' => 'nullable|string', + 'postal_code' => 'nullable|string|max:10', + 'status' => 'nullable|boolean', + ]; + + return $rules; + } + + /** + * Determine if the user is authorized to make this request. + */ + public function authorize() + : bool + { + return true; + } + } diff --git a/app/Models/Debiture.php b/app/Models/Debiture.php index 39b13d9..df5b9d2 100644 --- a/app/Models/Debiture.php +++ b/app/Models/Debiture.php @@ -16,7 +16,6 @@ 'name', 'registered_at', 'npwp', - 'nomor_id', 'email', 'phone', 'nomor_rekening', diff --git a/app/Models/DokumenJaminan.php b/app/Models/DokumenJaminan.php new file mode 100644 index 0000000..8c5b944 --- /dev/null +++ b/app/Models/DokumenJaminan.php @@ -0,0 +1,69 @@ +belongsTo(Province::class, 'province_code', 'code'); + } + + public function city() + { + return $this->belongsTo(City::class, 'city_code', 'code'); + } + + public function district() + { + return $this->belongsTo(District::class, 'district_code', 'code'); + } + + public function village() + { + return $this->belongsTo(Village::class, 'village_code', 'code'); + } + + public function debiture(){ + return $this->belongsTo(Debiture::class, 'debiture_id', 'id'); + } + + public function pemilik(){ + return $this->belongsTo(PemilikJaminan::class, 'pemilik_jaminan_id', 'id'); + } + + public function jenisJaminan(){ + return $this->belongsTo(JenisJaminan::class, 'jenis_jaminan_id', 'id'); + } + + public function jenisLegalitasJaminan(){ + return $this->belongsTo(JenisLegalitasJaminan::class, 'jenis_legalitas_jaminan_id', 'id'); + } + } diff --git a/database/migrations/2024_08_12_022026_create_debitures_table.php b/database/migrations/2024_08_12_022026_create_debitures_table.php index 31537aa..583c859 100644 --- a/database/migrations/2024_08_12_022026_create_debitures_table.php +++ b/database/migrations/2024_08_12_022026_create_debitures_table.php @@ -23,10 +23,10 @@ $table->string('email', 100)->nullable(); $table->string('phone', 15)->nullable(); $table->string('nomor_rekening', 50)->nullable(); - $table->string('province_code')->index(); - $table->string('city_code')->index(); - $table->string('district_code')->index(); - $table->string('village_code')->index(); + $table->string('province_code')->nullable()->index(); + $table->string('city_code')->nullable()->index(); + $table->string('district_code')->nullable()->index(); + $table->string('village_code')->nullable()->index(); $table->string('postal_code', 5)->nullable(); $table->text('address')->nullable(); diff --git a/database/migrations/2024_08_20_090400_create_dokumen_jaminan_table.php b/database/migrations/2024_08_20_090400_create_dokumen_jaminan_table.php new file mode 100644 index 0000000..a6db5c4 --- /dev/null +++ b/database/migrations/2024_08_20_090400_create_dokumen_jaminan_table.php @@ -0,0 +1,54 @@ +id(); + $table->string('name'); + $table->foreignIdFor(Debiture::class)->constrained()->onDelete('cascade'); + $table->foreignIdFor(JenisJaminan::class)->constrained()->onDelete('cascade'); + $table->foreignIdFor(PemilikJaminan::class)->constrained()->onDelete('cascade'); + $table->foreignIdFor(JenisLegalitasJaminan::class)->constrained()->onDelete('cascade'); + $table->string('province_code')->nullable()->index(); + $table->string('city_code')->nullable()->index(); + $table->string('district_code')->nullable()->index(); + $table->string('village_code')->nullable()->index(); + $table->string('postal_code', 5)->nullable(); + $table->text('address')->nullable(); + $table->string('dokumen_jaminan')->nullable(); + $table->string('keterangan')->nullable(); + + $table->boolean('status')->default(true)->nullable(); + $table->timestamps(); + $table->timestamp('authorized_at')->nullable(); + $table->char('authorized_status', 1)->nullable(); + $table->softDeletes(); + + $table->unsignedBigInteger('created_by')->nullable(); + $table->unsignedBigInteger('updated_by')->nullable(); + $table->unsignedBigInteger('deleted_by')->nullable(); + $table->unsignedBigInteger('authorized_by')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('dokumen_jaminan'); + } +}; diff --git a/resources/views/debitur/components/debitur.blade.php b/resources/views/debitur/components/debitur.blade.php new file mode 100644 index 0000000..0e22694 --- /dev/null +++ b/resources/views/debitur/components/debitur.blade.php @@ -0,0 +1,206 @@ +
+ @if(isset($debitur->id)) + @method('PUT') + @endif + @csrf +
+ +
+ + @error('branch_id') + {{ $message }} + @enderror +
+
+
+ +
+ + @error('cif') + {{ $message }} + @enderror +
+
+
+ +
+ + @error('nomor_rekening') + {{ $message }} + @enderror +
+
+
+ +
+ + @error('name') + {{ $message }} + @enderror +
+
+
+ +
+ + @error('npwp') + {{ $message }} + @enderror +
+
+
+ +
+ + @error('email') + {{ $message }} + @enderror +
+
+
+ +
+ + @error('phone') + {{ $message }} + @enderror +
+
+
+ +
+
+
+ + @error('province_code') + {{ $message }} + @enderror +
+
+ + @error('city_code') + {{ $message }} + @enderror +
+
+
+
+ + @error('district_code') + {{ $message }} + @enderror +
+
+ + @error('district_code') + {{ $message }} + @enderror +
+
+ + @error('postal_code') + {{ $message }} + @enderror +
+
+
+ + @error('address') + {{ $message }} + @enderror +
+
+
+
+ +
+
diff --git a/resources/views/debitur/components/dokumen.blade.php b/resources/views/debitur/components/dokumen.blade.php new file mode 100644 index 0000000..cda5aa5 --- /dev/null +++ b/resources/views/debitur/components/dokumen.blade.php @@ -0,0 +1,243 @@ +
+ @if(isset($document->id)) + @method('PUT') + @endif + @csrf + +
+ +
+ +

{{ $debitur->name }} | {{ $debitur->address.', '.$debitur->village->name.', '.$debitur->city->name.', '.$debitur->province->name.', '.$debitur->postal_code }}

+
+
+
+ +
+
+ + + Tambah Pemilik Jaminan + +
+ @error('pemilik_jaminan_id') + {{ $message }} + @enderror +
+
+
+ +
+ + @error('jenis_jaminan_id') + {{ $message }} + @enderror +
+
+
+ +
+ + @error('jenis_legalitas_jaminan_id') + {{ $message }} + @enderror +
+
+
+ +
+ + @error('name') + {{ $message }} + @enderror +
+
+ +
+ +
+ + @if(isset($document->dokumen_jaminan)) + {{ basename($document->dokumen_jaminan) }} + @endif + @error('dokumen_jaminan') + {{ $message }} + @enderror +
+
+ +
+ +
+ + @error('keterangan') + {{ $message }} + @enderror +
+
+ +
+ +
+
+
+ + @error('province_code') + {{ $message }} + @enderror +
+
+ + @error('city_code') + {{ $message }} + @enderror +
+
+
+
+ + @error('district_code') + {{ $message }} + @enderror +
+
+ + @error('district_code') + {{ $message }} + @enderror +
+
+ + @error('postal_code') + {{ $message }} + @enderror +
+
+
+ + @error('address') + {{ $message }} + @enderror +
+
+
+
+ +
+
diff --git a/resources/views/debitur/components/jaminan.blade.php b/resources/views/debitur/components/jaminan.blade.php new file mode 100644 index 0000000..d5009fc --- /dev/null +++ b/resources/views/debitur/components/jaminan.blade.php @@ -0,0 +1,162 @@ +
+ @foreach($documents as $document) +
+
+
+
+ + + + + + +
+ + +
+
+
+ + {{ $document->name }} + + + {{ $document->jenisJaminan->name }} | {{ $document->jenisLegalitasJaminan->name }} + +
+
+ +
+
+
+ + pemilik jaminan + +

+ {{ $document->pemilik->name }} +

+
+
+
+ @if($document->dokumen_jaminan) + +
+
+ @endif +
+ + keterangan + +

+ {{ $document->keterangan }} +

+
+
+
+
+ + alamat + +

+ {{ $document->address.', '.$document->village->name.', '.$document->city->name.', '.$document->province->name.', '.$document->postal_code }} +

+
+
+
+ @endforeach + + +
+
+
+
+ + + + + + +
+ + +
+
+
+
+ + Data Jaminan + + + Tambah Pemilik dan Dokumen Jaminan + +
+
+
+
+
+ + +@push('scripts') + + +@endpush diff --git a/resources/views/debitur/components/pemilik.blade.php b/resources/views/debitur/components/pemilik.blade.php new file mode 100644 index 0000000..e69de29 diff --git a/resources/views/debitur/create.blade.php b/resources/views/debitur/create.blade.php index 8867136..9b66b49 100644 --- a/resources/views/debitur/create.blade.php +++ b/resources/views/debitur/create.blade.php @@ -6,237 +6,20 @@ @section('content')
- @if(isset($debitur->id)) -
- - @method('PUT') - @else - - @endif - @csrf -
-
-

- {{ isset($debitur->id) ? 'Edit' : 'Tambah' }} Debitur -

-
- Back -
-
-
-
- -
- - @error('branch_id') - {{ $message }} - @enderror -
-
-
- -
- - @error('cif') - {{ $message }} - @enderror -
-
-
- -
- - @error('nomor_rekening') - {{ $message }} - @enderror -
-
-
- -
- - @error('name') - {{ $message }} - @enderror -
-
-
- -
- - @error('nomor_id') - {{ $message }} - @enderror -
-
-
- -
- - @error('npwp') - {{ $message }} - @enderror -
-
-
- -
- - @error('email') - {{ $message }} - @enderror -
-
-
- -
- - @error('phone') - {{ $message }} - @enderror -
-
-
- -
-
-
- - @error('province_code') - {{ $message }} - @enderror -
-
- - @error('city_code') - {{ $message }} - @enderror -
-
-
-
- - @error('district_code') - {{ $message }} - @enderror -
-
- - @error('district_code') - {{ $message }} - @enderror -
-
- - @error('postal_code') - {{ $message }} - @enderror -
-
-
- - @error('address') - {{ $message }} - @enderror -
-
-
-
- -
-
-
-
@endsection diff --git a/resources/views/debitur/edit.blade.php b/resources/views/debitur/edit.blade.php new file mode 100644 index 0000000..754548f --- /dev/null +++ b/resources/views/debitur/edit.blade.php @@ -0,0 +1,29 @@ +@extends('layouts.main') + +@section('breadcrumbs') + {{ Breadcrumbs::render(request()->route()->getName()) }} +@endsection + +@section('content') +
+ +
+ +
+ @if(request()->routeIs('debitur.edit', $debitur)) + @include('lpj::debitur.components.debitur') + @else + @include('lpj::debitur.components.jaminan') + @endif +
+
+
+@endsection diff --git a/resources/views/debitur/jaminan.blade.php b/resources/views/debitur/jaminan.blade.php new file mode 100644 index 0000000..d7938f3 --- /dev/null +++ b/resources/views/debitur/jaminan.blade.php @@ -0,0 +1,24 @@ +@extends('layouts.main') + +@section('breadcrumbs') + {{ Breadcrumbs::render(request()->route()->getName()) }} +@endsection + +@section('content') +
+ +
+
+

+ {{ isset($document->id) ? 'Edit' : 'Tambah' }} Data Jaminan +

+
+ Back +
+
+
+ @include('lpj::debitur.components.dokumen') +
+
+
+@endsection diff --git a/routes/breadcrumbs.php b/routes/breadcrumbs.php index 6eea2fc..b99a5f2 100644 --- a/routes/breadcrumbs.php +++ b/routes/breadcrumbs.php @@ -198,7 +198,22 @@ }); Breadcrumbs::for('debitur.edit', function (BreadcrumbTrail $trail) { - $trail->parent('basicdata.branch'); - $trail->push('Edit Debitur'); + $trail->parent('debitur'); + $trail->push('Data Debitur'); + }); + + Breadcrumbs::for('debitur.jaminan', function (BreadcrumbTrail $trail) { + $trail->parent('debitur'); + $trail->push('Data Jaminan Debitur'); + }); + + Breadcrumbs::for('debitur.jaminan.create', function (BreadcrumbTrail $trail) { + $trail->parent('debitur.jaminan'); + $trail->push('Tambah Data Jaminan Debitur'); + }); + + Breadcrumbs::for('debitur.jaminan.edit', function (BreadcrumbTrail $trail) { + $trail->parent('debitur.jaminan'); + $trail->push('Edit Data Jaminan Debitur'); }); diff --git a/routes/web.php b/routes/web.php index b620dba..14ece25 100644 --- a/routes/web.php +++ b/routes/web.php @@ -92,7 +92,7 @@ 'edit' => 'currency.edit', 'update' => 'currency.update', 'destroy' => 'currency.destroy', - ] + ], ]); Route::name('branch.')->prefix('cabang')->group(function () { @@ -111,7 +111,7 @@ 'edit' => 'branch.edit', 'update' => 'branch.update', 'destroy' => 'branch.destroy', - ] + ], ]); Route::name('nilai-plafond.')->prefix('nilai-plafond')->group(function () { @@ -148,10 +148,19 @@ }); Route::name('debitur.')->prefix('debitur')->group(function () { + Route::get('download/{id}', [DebitureController::class, 'download'])->name('download'); Route::get('restore/{id}', [DebitureController::class, 'restore'])->name('restore'); Route::get('datatables', [DebitureController::class, 'dataForDatatables']) ->name('datatables'); Route::get('export', [DebitureController::class, 'export'])->name('export'); + + + Route::get('{id}/jaminan', [DebitureController::class, 'jaminan'])->name('jaminan'); + Route::get('{id}/jaminan/create', [DebitureController::class, 'createJaminan'])->name('jaminan.create'); + Route::get('{id}/jaminan/{jaminan}/edit', [DebitureController::class,'editJaminan'])->name('jaminan.edit'); + Route::put('{id}/jaminan/{jaminan}', [DebitureController::class, 'updateJaminan'])->name('jaminan.update'); + Route::post('{id}/jaminan/store', [DebitureController::class,'storeJaminan'])->name('jaminan.store'); + Route::delete('{id}/jaminan/{jaminan}', [DebitureController::class, 'destroyJaminan'])->name('jaminan.destroy'); }); Route::resource('debitur', DebitureController::class);