diff --git a/app/Exports/PermohonanExport.php b/app/Exports/PermohonanExport.php index 07b83fe..c6ce0a2 100644 --- a/app/Exports/PermohonanExport.php +++ b/app/Exports/PermohonanExport.php @@ -28,6 +28,8 @@ $row->branch->name, $row->tujuanPenilaian->name, $row->debiture->name, + $row->fasilitasKredit->name, + $row->plafond->name, $row->status, $row->authorized_at, $row->authorized_status, @@ -47,7 +49,9 @@ 'Branch Pemohon', 'Tujuan Penilaian', 'Debitur', - 'Status', + 'Jenis Fasilitas Kredit', + 'Nilai Plafond', + 'Status Permohonan', 'Tanggal Pengesahan', 'Status Pengesahan', 'Pengesah', @@ -61,7 +65,8 @@ return [ 'A' => NumberFormat::FORMAT_NUMBER, 'C' => NumberFormat::FORMAT_DATE_DATETIME, - 'L' => NumberFormat::FORMAT_DATE_DATETIME + 'K' => NumberFormat::FORMAT_DATE_DATETIME, + 'N' => NumberFormat::FORMAT_DATE_DATETIME ]; } } diff --git a/app/Http/Controllers/DebitureController.php b/app/Http/Controllers/DebitureController.php index e6762e3..b429265 100644 --- a/app/Http/Controllers/DebitureController.php +++ b/app/Http/Controllers/DebitureController.php @@ -71,6 +71,7 @@ public function update(DebitureRequest $request, $id) { + //print_r($request->all());exit; $validate = $request->validated(); if ($validate) { diff --git a/app/Http/Controllers/PermohonanController.php b/app/Http/Controllers/PermohonanController.php index 4c54795..5fe6996 100644 --- a/app/Http/Controllers/PermohonanController.php +++ b/app/Http/Controllers/PermohonanController.php @@ -2,17 +2,24 @@ namespace Modules\Lpj\Http\Controllers; -use App\Http\Controllers\Controller; -use Exception; -use Illuminate\Http\Request; -use Maatwebsite\Excel\Facades\Excel; -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\Permohonan; -use Modules\Lpj\Models\StatusPermohonan; -use Modules\Lpj\Models\TujuanPenilaian; + use App\Http\Controllers\Controller; + 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\StatusPermohonan; + use Modules\Lpj\Models\TujuanPenilaian; class PermohonanController extends Controller { @@ -27,24 +34,278 @@ class PermohonanController extends Controller { $validate = $request->validated(); - // dump($validate); - if ($validate) { - try { - // Save to database qq - Permohonan::create($validate); - return redirect() - ->route('permohonan.index') - ->with('success', 'Permohonan created successfully'); - } catch (Exception $e) { + public function store(PermohonanRequest $request) + { + + $validate = $request->validated(); + if ($validate) { + try { + // Save to database + Permohonan::create($validate); + return redirect() + ->route('permohonan.index') + ->with('success', 'Permohonan created successfully'); + } catch (Exception $e) { + return redirect() + ->route('permohonan.create') + ->with('error', 'Failed to create permohonan' . $e->getMessage()); + } + } else { return redirect() ->route('permohonan.create') ->with('error', 'Failed to create permohonan' . $e->getMessage()); } - } else { - return redirect() - ->route('permohonan.create') - ->with('success', 'error naon iye') - ->withInput(); + } + + public function create() + { + return view('lpj::permohonan.create'); + } + + public function createPermohonan($debitur) + { + $branches = Branch::all(); + $debitur = Debiture::find($debitur); + $tujuanPenilaian = TujuanPenilaian::all(); + $status = StatusPermohonan::all(); + $fasilitasKredit = JenisFasilitasKredit::all(); + $plafond = NilaiPlafond::all(); + + return view( + 'lpj::permohonan.form', + compact('branches', 'debitur', 'tujuanPenilaian', 'status', 'fasilitasKredit', 'plafond'), + ); + } + + public function edit($id) + { + $permohonan = Permohonan::find($id); + $branches = Branch::all(); + $debitur = Debiture::find($permohonan->debiture_id); + $tujuanPenilaian = TujuanPenilaian::all(); + $status = StatusPermohonan::all(); + $provinces = Province::all(); + $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(); + $documents = DokumenJaminan::with('pemilik', 'detail')->where('debiture_id', $id)->get(); + + $fasilitasKredit = JenisFasilitasKredit::all(); + $plafond = NilaiPlafond::all(); + + return view( + 'lpj::permohonan.form', + compact( + 'permohonan', + 'branches', + 'debitur', + 'tujuanPenilaian', + 'status', + 'provinces', + 'cities', + 'districts', + 'villages', + 'documents', + 'fasilitasKredit', + 'plafond', + ), + ); + } + + public function update(PermohonanRequest $request, $id) + { + $validate = $request->validated(); + + if ($validate) { + try { + // Update in database + $permohonan = Permohonan::find($id); + $permohonan->update($validate); + return redirect() + ->route('permohonan.index') + ->with('success', 'Permohonan updated successfully'); + } catch (Exception $e) { + return redirect() + ->route('permohonan.edit', $id) + ->with('error', 'Failed to update permohonan'); + } + } + } + + public function destroy($id) + { + try { + // Delete from database + $permohonan = Permohonan::find($id); + $permohonan->delete(); + + echo json_encode(['success' => true, 'message' => 'Permohonan deleted successfully']); + } catch (Exception $e) { + echo json_encode(['success' => false, 'message' => 'Failed to delete permohonan']); + } + } + + 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.'); + } + + // Retrieve data from the database + $query = Permohonan::query(); + + // Apply search filter if provided + if ($request->has('search') && !empty($request->get('search'))) { + $search = $request->get('search'); + $query->where(function ($q) use ($search) { + $q->where('nomor_registrasi', 'LIKE', '%' . $search . '%'); + $q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%'); + $q->orWhereRelation('user', 'name', 'LIKE', '%' . $search . '%'); + $q->orWhereRelation('debiture', 'name', 'LIKE', '%' . $search . '%'); + $q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%'); + $q->orWhereRelation('branch', 'name', '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(); + + // 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(['user', 'debiture', 'branch', 'tujuanPenilaian'])->get(); + + // Calculate the page count + $pageCount = ceil($totalRecords / $request->get('size')); + + // Calculate the current page number + $currentPage = 0 + 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, + ]); + } + + public function export() + { + return Excel::download(new PermohonanExport, 'permohonan.xlsx'); + } + + public function authorization() + { + return view('lpj::permohonan.authorization.index'); + } + + public function dataForAuthorization(Request $request) + { + if (is_null($this->user) || !$this->user->can('debitur.view')) { + //abort(403, 'Sorry! You are not allowed to view users.'); + } + + // Retrieve data from the database + $query = Permohonan::query(); + + // Apply search filter if provided + if ($request->has('search') && !empty($request->get('search'))) { + $search = $request->get('search'); + $query->where(function ($q) use ($search) { + $q->where('nomor_registrasi', 'LIKE', '%' . $search . '%'); + $q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%'); + $q->orWhereRelation('user', 'name', 'LIKE', '%' . $search . '%'); + $q->orWhereRelation('debiture', 'name', 'LIKE', '%' . $search . '%'); + $q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%'); + $q->orWhereRelation('branch', 'name', '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(); + + // 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(['user', 'debiture', 'branch', 'tujuanPenilaian'])->where('status', '=', 'order')->get( + ); + + // Calculate the page count + $pageCount = ceil($totalRecords / $request->get('size')); + + // Calculate the current page number + $currentPage = 0 + 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, + ]); + } + + public function showAuthorization($id) + { + $permohonan = Permohonan::find($id); + return view('lpj::permohonan.authorization.show', compact('permohonan')); + } + + public function updateAuthorization(Request $request, $id) + { + try { + $permohonan = Permohonan::find($id); + $permohonan->status = $request->status; + $permohonan->keterangan = $request->keterangan; + $permohonan->save(); + } catch (Exception $e) { + return redirect()->route('authorization.show', $id)->with('error', 'Failed to update permohonan'); + } + + return redirect()->route('authorization.index')->with('success', 'Permohonan updated successfully'); } } diff --git a/app/Http/Requests/DebitureRequest.php b/app/Http/Requests/DebitureRequest.php index ff87263..7f83fbb 100644 --- a/app/Http/Requests/DebitureRequest.php +++ b/app/Http/Requests/DebitureRequest.php @@ -3,6 +3,7 @@ namespace Modules\Lpj\Http\Requests; use Illuminate\Foundation\Http\FormRequest; + use Modules\Lpj\Rules\UniqueCifExceptZero; class DebitureRequest extends FormRequest { @@ -21,7 +22,7 @@ 'nomor_rekening' => 'nullable|string|max:50', 'name' => 'required', 'registered_at' => 'nullable|date', - 'npwp' => 'nullable|string|max:16', + 'npwp' => 'nullable|string|min:15|max:16', 'email' => 'nullable|email', 'phone' => 'nullable|string|max:15', 'address' => 'nullable|string', @@ -29,10 +30,10 @@ 'status' => 'nullable|boolean' ]; - if ($this->method() == 'PUT') { - $rules['cif'] = 'nullable|unique:debitures,cif,' . $this->id; - } else { - $rules['cif'] = 'nullable|unique:debitures,cif'; + if($this->method() == 'PUT'){ + $rules['cif'] = ['required', new UniqueCifExceptZero($this->id)]; + }else{ + $rules['cif'] = ['required', new UniqueCifExceptZero(null)]; } return $rules; diff --git a/app/Http/Requests/PermohonanRequest.php b/app/Http/Requests/PermohonanRequest.php index e4c4bd8..edd4169 100644 --- a/app/Http/Requests/PermohonanRequest.php +++ b/app/Http/Requests/PermohonanRequest.php @@ -14,13 +14,15 @@ : array { $rules = [ - 'nomor_registrasi' => 'nullable|string|max:10', - 'tanggal_permohonan' => 'nullable|date', - 'user_id' => 'nullable|exists:users,id', - 'branch_id' => 'required|exists:branches,id', - 'tujuan_penilaian_id' => 'required|exists:tujuan_penilaian,id', - 'debiture_id' => 'required|exists:debitures,id', - 'status' => 'required|string', + 'nomor_registrasi' => 'nullable|string|max:10', + 'tanggal_permohonan' => 'nullable|date', + 'user_id' => 'nullable|exists:users,id', + 'branch_id' => 'required|exists:branches,id', + 'tujuan_penilaian_id' => 'required|exists:tujuan_penilaian,id', + 'debiture_id' => 'required|exists:debitures,id', + 'status' => 'required|string', + 'jenis_fasilitas_kredit_id' => 'required|exists:jenis_fasilitas_kredit,id', + 'nilai_plafond_id' => 'required|exists:nilai_plafond,id', ]; return $rules; diff --git a/app/Http/Requests/StatusPermohonanRequest.php b/app/Http/Requests/StatusPermohonanRequest.php index 21bd8e5..d0a9ac6 100644 --- a/app/Http/Requests/StatusPermohonanRequest.php +++ b/app/Http/Requests/StatusPermohonanRequest.php @@ -16,6 +16,7 @@ $rules = [ 'description' => 'nullable|max:255', 'status' => 'required|boolean', + 'slug' => 'nullable|max:255', ]; if ($this->method() == 'PUT') { @@ -37,9 +38,9 @@ public function prepareForValidation() { - $this->merge([ + return $this->merge([ 'status' => isset($this->status) ? 1 : 0, - 'slug'=> Str::slug($this->name) + 'slug' => Str::slug($this->name), ]); } } diff --git a/app/Models/Debiture.php b/app/Models/Debiture.php index df5b9d2..8980513 100644 --- a/app/Models/Debiture.php +++ b/app/Models/Debiture.php @@ -56,4 +56,8 @@ return $this->belongsTo(Village::class, 'village_code', 'code'); } + public function documents(){ + return $this->hasMany(DokumenJaminan::class); + } + } diff --git a/app/Models/Permohonan.php b/app/Models/Permohonan.php index 28b6de5..cf6d5e6 100644 --- a/app/Models/Permohonan.php +++ b/app/Models/Permohonan.php @@ -17,10 +17,14 @@ class Permohonan extends Base 'branch_id', 'tujuan_penilaian_id', 'debiture_id', + 'keterangan', + 'jenis_fasilitas_kredit_id', + 'nilai_plafond_id', 'status', 'authorized_at', 'authorized_status', 'authorized_by', + ]; public function user(){ @@ -42,4 +46,12 @@ class Permohonan extends Base public function documents(){ return $this->hasMany(DokumenJaminan::class); } + + public function nilaiPlafond(){ + return $this->belongsTo(NilaiPlafond::class); + } + + public function jenisFasilitasKredit(){ + return $this->belongsTo(JenisFasilitasKredit::class); + } } diff --git a/app/Rules/UniqueCifExceptZero.php b/app/Rules/UniqueCifExceptZero.php new file mode 100644 index 0000000..e7236ce --- /dev/null +++ b/app/Rules/UniqueCifExceptZero.php @@ -0,0 +1,25 @@ +id = $id; + } + + public function validate($attribute, $value, $fail): void + { + if (Debiture::where($attribute, $value) + ->where('id', '!=', $this->id) + ->where($attribute, '!=', '000000') + ->exists()) { + $fail('The :attribute field must be uniquse.'.$this->id); + } + } +} diff --git a/database/migrations/2024_09_04_082059_update_jenis_jaminan_table.php b/database/migrations/2024_09_04_082059_update_jenis_jaminan_table.php index 0f96b67..f148718 100644 --- a/database/migrations/2024_09_04_082059_update_jenis_jaminan_table.php +++ b/database/migrations/2024_09_04_082059_update_jenis_jaminan_table.php @@ -12,6 +12,7 @@ return new class extends Migration public function up(): void { Schema::table('jenis_jaminan', function (Blueprint $table) { + $table->string('slug')->after('name'); $table->string('jenis_legalitas_jaminan_id')->nullable()->after('slug'); }); } @@ -22,6 +23,7 @@ return new class extends Migration public function down(): void { Schema::table('jenis_jaminan', function (Blueprint $table) { + $table->dropColumn('slug'); $table->dropColumn('jenis_legalitas_jaminan_id'); }); } diff --git a/database/migrations/2024_09_13_030119_update_permohonan_table.php b/database/migrations/2024_09_13_030119_update_permohonan_table.php new file mode 100644 index 0000000..1906224 --- /dev/null +++ b/database/migrations/2024_09_13_030119_update_permohonan_table.php @@ -0,0 +1,33 @@ +foreignIdFor(JenisFasilitasKredit::class)->nullable()->onDelete('cascade'); + $table->foreignIdFor(NilaiPlafond::class)->nullable()->onDelete('cascade'); + $table->string('status')->default('order')->change(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('permohonan', function (Blueprint $table) { + $table->dropForeign(['fasilitas_kredit_id']); + $table->dropForeign(['nilai_plafond_id']); + }); + } +}; diff --git a/module.json b/module.json index ee2a861..f2c4211 100644 --- a/module.json +++ b/module.json @@ -47,7 +47,7 @@ }, { "title": "Authorization", - "path": "", + "path": "authorization", "icon": "ki-filled ki-some-files text-lg", "classes": "", "attributes": [], @@ -123,17 +123,9 @@ "permission": "", "roles": [] }, - { - "title": "Jenis Jaminan", - "path": "basicdata.jenis-jaminan", - "classes": "", - "attributes": [], - "permission": "", - "roles": [] - }, { "title": "Jenis Aset", - "path": "basicdata.jenis-aset", + "path": "basicdata.jenis-jaminan", "classes": "", "attributes": [], "permission": "", diff --git a/resources/views/debitur/components/debitur.blade.php b/resources/views/debitur/components/debitur.blade.php index 8170af7..157ad1b 100644 --- a/resources/views/debitur/components/debitur.blade.php +++ b/resources/views/debitur/components/debitur.blade.php @@ -1,5 +1,6 @@