Feat: Meningkatkan PermohonanController dengan fitur-fitur baru dan meningkatkan penanganan data

- Merombak PermohonanController agar struktur dan keterbacaannya lebih baik.
- Menambahkan penanganan unggahan file dalam metode penyimpanan.
- Menerapkan validasi data dan penanganan kesalahan untuk membuat dan memperbarui Permohonan.
- Memperkenalkan pagination dan sorting dalam metode dataForDatatables dan dataForAuthorization.
- Menambahkan fungsi ekspor untuk data Permohonan.
- Membuat migrasi baru untuk menambahkan kolom 'nomor_registrasi' ke tabel 'persetujuan_penawaran'.
This commit is contained in:
2025-05-08 10:19:36 +07:00
parent 1c35d932d3
commit 0df676fa5e
3 changed files with 677 additions and 617 deletions

View File

@@ -1,153 +1,160 @@
<?php
namespace Modules\Lpj\Http\Controllers;
namespace Modules\Lpj\Http\Controllers;
use App\Http\Controllers\Controller;
use Barryvdh\DomPDF\Facade\Pdf;
use Exception;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
use Modules\Location\Models\City;
use Modules\Location\Models\District;
use Modules\Location\Models\Province;
use Modules\Location\Models\Village;
use Modules\Lpj\Exports\PermohonanExport;
use Modules\Lpj\Http\Requests\PermohonanRequest;
use Modules\Lpj\Models\Branch;
use Modules\Lpj\Models\Debiture;
use Modules\Lpj\Models\DokumenJaminan;
use Modules\Lpj\Models\JenisFasilitasKredit;
use Modules\Lpj\Models\NilaiPlafond;
use Modules\Lpj\Models\Permohonan;
use Modules\Lpj\Models\PermohonanPembatalan;
use Modules\Lpj\Models\StatusPermohonan;
use Modules\Lpj\Models\TujuanPenilaian;
use Modules\Lpj\Services\PermohonanHistoryService;
use App\Http\Controllers\Controller;
use Barryvdh\DomPDF\Facade\Pdf;
use Exception;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
use Modules\Location\Models\City;
use Modules\Location\Models\District;
use Modules\Location\Models\Province;
use Modules\Location\Models\Village;
use Modules\Lpj\Exports\PermohonanExport;
use Modules\Lpj\Http\Requests\PermohonanRequest;
use Modules\Lpj\Models\Branch;
use Modules\Lpj\Models\Debiture;
use Modules\Lpj\Models\DokumenJaminan;
use Modules\Lpj\Models\JenisFasilitasKredit;
use Modules\Lpj\Models\NilaiPlafond;
use Modules\Lpj\Models\Permohonan;
use Modules\Lpj\Models\PermohonanPembatalan;
use Modules\Lpj\Models\StatusPermohonan;
use Modules\Lpj\Models\TujuanPenilaian;
use Modules\Lpj\Services\PermohonanHistoryService;
class PembatalanController extends Controller
class PembatalanController extends Controller
{
protected $historyService;
public function __construct(PermohonanHistoryService $historyService)
{
public $user;
protected $historyService;
$this->historyService = $historyService;
}
public function __construct(PermohonanHistoryService $historyService)
{
$this->historyService = $historyService;
}
public function index()
{
$user = auth()->user();
return view('lpj::pembatalan.index', compact('user'));
}
public function index()
{
return view('lpj::pembatalan.index');
}
public function edit($id)
{
$user = auth()->user();
$pembatalan = PermohonanPembatalan::with(['permohonan.debiture', 'permohonan.branch'])->find($id);
public function edit($id)
{
$pembatalan = PermohonanPembatalan::with(['permohonan.debiture','permohonan.branch'])->find($id);
return view(
'lpj::pembatalan.form',
compact(
'pembatalan',
'user'
),
);
}
return view(
'lpj::pembatalan.form',
compact(
'pembatalan'
),
);
}
public function update(Request $request, $id)
{
$user = auth()->user();
$pembatalan = PermohonanPembatalan::findOrFail($id);
$permohonan = Permohonan::find($pembatalan->permohonan_id);
$beforeRequest = $permohonan->toArray();
public function update(Request $request, $id)
{
$pembatalan = PermohonanPembatalan::findOrFail($id);
$permohonan = Permohonan::find($pembatalan->permohonan_id);
$beforeRequest = $permohonan->toArray();
try {
// Update Permohonan Pembatalan
if ($request->status == 'approved') {
$pembatalan->status = 'approved';
$pembatalan->authorized_at = now();
$pembatalan->authorized_by = $user->id;
$pembatalan->authorized_status = 1;
$pembatalan->save();
try {
// Update Permohonan Pembatalan
if($request->status=='approved'){
$pembatalan->status = 'approved';
$pembatalan->authorized_at = now();
$pembatalan->authorized_by = auth()->user()->id;
$pembatalan->authorized_status = 1;
$pembatalan->save();
$permohonan->status = 'batal';
$permohonan->save();
} else{
$pembatalan->status = 'rejected';
$pembatalan->authorized_at = now();
$pembatalan->authorized_by = auth()->user()->id;
$pembatalan->authorized_status = 3;
$pembatalan->save();
}
return redirect()
->route('pembatalan.index')->with('success', 'Permohonan Pembatalan updated successfully');
} catch (Exception $e) {
return redirect()
->route('pembatalan.edit', $id)->with('error', 'Failed to update permohonan Pembatalan');
}
}
public function dataForDatatables(Request $request)
{
if (is_null($this->user) || !$this->user->can('debitur.view')) {
//abort(403, 'Sorry! You are not allowed to view users.');
$permohonan->status = 'batal';
$permohonan->save();
} else {
$pembatalan->status = 'rejected';
$pembatalan->authorized_at = now();
$pembatalan->authorized_by = $user->id;
$pembatalan->authorized_status = 3;
$pembatalan->save();
}
// Retrieve data from the database
$query = PermohonanPembatalan::query();
$query = $query->orderBy('created_at', 'desc');
// Apply search filter if provided
if ($request->has('search') && !empty($request->get('search'))) {
$search = $request->get('search');
$query->where(function ($q) use ($search) {
$q->orWhereRelation('permohonan', 'nomor_registrasi', 'LIKE', '%' . $search . '%');
$q->orWhereRelation('permohonan.debiture', 'name', 'LIKE', '%' . $search . '%');
$q->orWhere('alasan_pembatalan', 'LIKE', '%' . $search . '%');
$q->orWhere('status', 'LIKE', '%' . $search . '%');
});
}
// Apply sorting if provided
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
$order = $request->get('sortOrder');
$column = $request->get('sortField');
$query->orderBy($column, $order);
}
// Get the total count of records
$totalRecords = $query->count();
$size = $request->get('size', 10);
if ($size == 0) {
$size = 10;
}
// Apply pagination if provided
if ($request->has('page') && $request->has('size')) {
$page = $request->get('page');
$size = $request->get('size');
$offset = ($page - 1) * $size; // Calculate the offset
$query->skip($offset)->take($size);
}
// Get the filtered count of records
$filteredRecords = $query->count();
// Get the data for the current page
$data = $query->with(['permohonan.debiture','permohonan.branch','creator'])->get();
// Calculate the page count
$pageCount = ceil($totalRecords / $size);
// Calculate the current page number
$currentPage = max(1, $request->get('page', 1));
// Return the response data as a JSON object
return response()->json([
'draw' => $request->get('draw'),
'recordsTotal' => $totalRecords,
'recordsFiltered' => $filteredRecords,
'pageCount' => $pageCount,
'page' => $currentPage,
'totalCount' => $totalRecords,
'data' => $data,
]);
return redirect()
->route('pembatalan.index')->with('success', 'Permohonan Pembatalan updated successfully');
} catch (Exception $e) {
return redirect()
->route('pembatalan.edit', $id)->with('error', 'Failed to update permohonan Pembatalan');
}
}
public function dataForDatatables(Request $request)
{
$user = auth()->user();
if (is_null($user) || !$user->can('debitur.view')) {
//abort(403, 'Sorry! You are not allowed to view users.');
}
// Retrieve data from the database
$query = PermohonanPembatalan::query()->with(['permohonan']);
$query = $query->orderBy('created_at', 'desc');
// Apply search filter if provided
if ($request->has('search') && !empty($request->get('search'))) {
$search = $request->get('search');
$query->where(function ($q) use ($search) {
$q->orWhereRelation('permohonan', 'nomor_registrasi', 'LIKE', '%' . $search . '%');
$q->orWhereRelation('permohonan.debiture', 'name', 'LIKE', '%' . $search . '%');
$q->orWhere('alasan_pembatalan', 'LIKE', '%' . $search . '%');
$q->orWhere('status', 'LIKE', '%' . $search . '%');
});
}
// Apply sorting if provided
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
$order = $request->get('sortOrder');
$column = $request->get('sortField');
// Only allow sorting by existing columns
if (in_array($column, ['created_at', 'status', 'alasan_pembatalan'])) {
$query->orderBy($column, $order);
}
}
// Get the total count of records
$totalRecords = $query->count();
$size = $request->get('size', 10);
if ($size == 0) {
$size = 10;
}
// Apply pagination if provided
if ($request->has('page') && $request->has('size')) {
$page = $request->get('page');
$size = $request->get('size');
$offset = ($page - 1) * $size; // Calculate the offset
$query->skip($offset)->take($size);
}
// Get the filtered count of records
$filteredRecords = $query->count();
// Get the data for the current page
$data = $query->with(['permohonan.debiture', 'permohonan.branch', 'creator'])->get();
// Calculate the page count
$pageCount = ceil($totalRecords / $size);
// Calculate the current page number
$currentPage = max(1, $request->get('page', 1));
// Return the response data as a JSON object
return response()->json([
'draw' => $request->get('draw'),
'recordsTotal' => $totalRecords,
'recordsFiltered' => $filteredRecords,
'pageCount' => $pageCount,
'page' => $currentPage,
'totalCount' => $totalRecords,
'data' => $data,
]);
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('persetujuan_penawaran', function (Blueprint $table) {
$table->string('nomor_registrasi')->nullable()->after('penawaran_id');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('persetujuan_penawaran', function (Blueprint $table) {
$table->dropColumn('nomor_registrasi');
});
}
};