From a43c65e4c25af4ea7942477a5c23decc404e1c42 Mon Sep 17 00:00:00 2001
From: Daeng Deni Mardaeni
Date: Thu, 30 Jan 2025 14:50:29 +0700
Subject: [PATCH 01/33] feat(penilaian): tambahkan kolom jenis laporan pada
tabel
- Menambahkan kolom "Jenis Laporan" di tampilan otorisator.
- Memperbarui controller untuk menyertakan data penilai.
---
app/Http/Controllers/PenilaianController.php | 1 +
.../views/penilaian/otorisator/index.blade.php | 14 ++++++++++++++
2 files changed, 15 insertions(+)
diff --git a/app/Http/Controllers/PenilaianController.php b/app/Http/Controllers/PenilaianController.php
index 4160d59..a3da8f7 100644
--- a/app/Http/Controllers/PenilaianController.php
+++ b/app/Http/Controllers/PenilaianController.php
@@ -680,6 +680,7 @@ class PenilaianController extends Controller
'penilaian.userPenilai' => function ($q) {
$q->where('role', 'penilai')->with(['user', 'team.regions'])->first();
},
+ 'penilai',
'approveSo',
'approveEo',
'approveDd',
diff --git a/resources/views/penilaian/otorisator/index.blade.php b/resources/views/penilaian/otorisator/index.blade.php
index 713c5dc..bd0d821 100644
--- a/resources/views/penilaian/otorisator/index.blade.php
+++ b/resources/views/penilaian/otorisator/index.blade.php
@@ -66,6 +66,11 @@
+
+ Jenis Laporan
+
+
+
Status Bayar
@@ -211,6 +216,15 @@
return '';
},
},
+ jenis_laporan: {
+ title: 'Jenis laporan',
+ render: (item, data) => {
+ if(data.penilai.type_penilai){
+ return `${data.penilai.type_penilai} `;
+ }
+ return '';
+ },
+ },
status_bayar: {
title: 'Status Bayar',
render: (item, data) => {
From 32de93ef9f65f22bb1b8d82b61bb0f5b1f3ca354 Mon Sep 17 00:00:00 2001
From: Daeng Deni Mardaeni
Date: Thu, 30 Jan 2025 15:54:52 +0700
Subject: [PATCH 02/33] feat(custom-field): tambahkan fitur custom field
- Menambahkan model CustomField dengan atribut mass assignable.
- Membuat request validation untuk custom field.
- Menambahkan route dan breadcrumb untuk custom field.
- Membuat migration untuk tabel custom_fields.
- Menambahkan export functionality untuk custom field.
- Membuat view untuk menambah dan mengedit custom field.
---
app/Exports/CustomFieldExport.php | 49 ++++++
.../Controllers/CustomFieldController.php | 150 ++++++++++++++++++
app/Http/Requests/CustomFieldRequest.php | 33 ++++
app/Models/CustomField.php | 24 +++
...1_30_082943_create_custom_fields_table.php | 34 ++++
module.json | 11 ++
.../views/custom_fields/create.blade.php | 67 ++++++++
resources/views/custom_fields/index.blade.php | 146 +++++++++++++++++
routes/breadcrumbs.php | 16 ++
routes/web.php | 13 +-
10 files changed, 542 insertions(+), 1 deletion(-)
create mode 100644 app/Exports/CustomFieldExport.php
create mode 100644 app/Http/Controllers/CustomFieldController.php
create mode 100644 app/Http/Requests/CustomFieldRequest.php
create mode 100644 app/Models/CustomField.php
create mode 100644 database/migrations/2025_01_30_082943_create_custom_fields_table.php
create mode 100644 resources/views/custom_fields/create.blade.php
create mode 100644 resources/views/custom_fields/index.blade.php
diff --git a/app/Exports/CustomFieldExport.php b/app/Exports/CustomFieldExport.php
new file mode 100644
index 0000000..5158d70
--- /dev/null
+++ b/app/Exports/CustomFieldExport.php
@@ -0,0 +1,49 @@
+id,
+ $row->name,
+ $row->type,
+ $row->created_at,
+ $row->updated_at,
+ ];
+ }
+
+ public function headings(): array
+ {
+ return [
+ 'ID',
+ 'Name',
+ 'Type',
+ 'Created At',
+ 'Updated At',
+ ];
+ }
+
+ public function columnFormats(): array
+ {
+ return [
+ 'A' => NumberFormat::FORMAT_NUMBER,
+ 'D' => NumberFormat::FORMAT_DATE_DDMMYYYY,
+ 'E' => NumberFormat::FORMAT_DATE_DDMMYYYY,
+ ];
+ }
+}
diff --git a/app/Http/Controllers/CustomFieldController.php b/app/Http/Controllers/CustomFieldController.php
new file mode 100644
index 0000000..ad41ee9
--- /dev/null
+++ b/app/Http/Controllers/CustomFieldController.php
@@ -0,0 +1,150 @@
+validated();
+
+ if ($validate) {
+ try {
+ // Save to database
+ CustomField::create($validate);
+ return redirect()
+ ->route('basicdata.custom-field.index')
+ ->with('success', 'Custom Field created successfully');
+ } catch (Exception $e) {
+ return redirect()
+ ->route('basicdata.custom-field.create')
+ ->with('error', $e->getMessage());
+ }
+ }
+ }
+
+ public function create()
+ {
+ return view('lpj::custom_fields.create');
+ }
+
+ public function edit($id)
+ {
+ $customField = CustomField::find($id);
+ return view('lpj::custom_fields.create', compact('customField'));
+ }
+
+ public function update(CustomFieldRequest $request, $id)
+ {
+ $validate = $request->validated();
+
+ if ($validate) {
+ try {
+ // Update in database
+ $customField = CustomField::find($id);
+ $customField->update($validate);
+ return redirect()
+ ->route('basicdata.custom-field.index')
+ ->with('success', 'Custom Field updated successfully');
+ } catch (Exception $e) {
+ return redirect()
+ ->route('basicdata.custom-field.edit', $id)
+ ->with('error', 'Failed to update custom field');
+ }
+ }
+ }
+
+ public function destroy($id)
+ {
+ try {
+ // Delete from database
+ $customField = CustomField::find($id);
+ $customField->delete();
+
+ echo json_encode(['success' => true, 'message' => 'Custom Field deleted successfully']);
+ } catch (Exception $e) {
+ echo json_encode(['success' => false, 'message' => 'Failed to delete custom field']);
+ }
+ }
+
+ public function dataForDatatables(Request $request)
+ {
+ if (is_null($this->user) || !$this->user->can('custom_fields.view')) {
+ //abort(403, 'Sorry! You are not allowed to view custom fields.');
+ }
+
+ // Retrieve data from the database
+ $query = CustomField::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('name', 'LIKE', "%$search%");
+ $q->orWhere('type', '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->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 CustomFieldExport, 'custom_fields.xlsx');
+ }
+}
diff --git a/app/Http/Requests/CustomFieldRequest.php b/app/Http/Requests/CustomFieldRequest.php
new file mode 100644
index 0000000..08c5740
--- /dev/null
+++ b/app/Http/Requests/CustomFieldRequest.php
@@ -0,0 +1,33 @@
+ 'required|max:255',
+ 'type' => 'required|in:text,select,radio,checkbox',
+ ];
+ }
+
+ /**
+ * Determine if the user is authorized to make this request.
+ */
+ public function authorize(): bool
+ {
+ return true;
+ }
+
+ public function prepareValidationData($data){
+ if(!$this->type){
+ $this->merge(['type' => 'text']);
+ }
+ }
+}
diff --git a/app/Models/CustomField.php b/app/Models/CustomField.php
new file mode 100644
index 0000000..94c43be
--- /dev/null
+++ b/app/Models/CustomField.php
@@ -0,0 +1,24 @@
+id();
+ $table->string('name');
+ $table->string('type');
+ $table->timestamps();
+ $table->softDeletes();
+
+ $table->unsignedBigInteger('created_by')->nullable();
+ $table->unsignedBigInteger('updated_by')->nullable();
+ $table->unsignedBigInteger('deleted_by')->nullable();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('custom_fields');
+ }
+};
diff --git a/module.json b/module.json
index 4d52030..8eb0128 100644
--- a/module.json
+++ b/module.json
@@ -851,6 +851,17 @@
"administrator",
"admin"
]
+ },
+ {
+ "title": "Custom Field",
+ "path": "basicdata.custom-field",
+ "classes": "",
+ "attributes": [],
+ "permission": "",
+ "roles": [
+ "administrator",
+ "admin"
+ ]
}
]
}
diff --git a/resources/views/custom_fields/create.blade.php b/resources/views/custom_fields/create.blade.php
new file mode 100644
index 0000000..31220b0
--- /dev/null
+++ b/resources/views/custom_fields/create.blade.php
@@ -0,0 +1,67 @@
+@php
+ $route = explode('.', Route::currentRouteName());
+@endphp
+
+@extends('layouts.main')
+
+@section('breadcrumbs')
+ {{ Breadcrumbs::render(request()->route()->getName()) }}
+@endsection
+
+@section('content')
+
+ @if(isset($customField->id))
+
+
+@endsection
diff --git a/resources/views/custom_fields/index.blade.php b/resources/views/custom_fields/index.blade.php
new file mode 100644
index 0000000..b6b128c
--- /dev/null
+++ b/resources/views/custom_fields/index.blade.php
@@ -0,0 +1,146 @@
+@extends('layouts.main')
+
+@section('breadcrumbs')
+ {{ Breadcrumbs::render('basicdata.custom-field') }}
+@endsection
+
+@section('content')
+
+@endsection
+
+@push('scripts')
+
+
+@endpush
+
diff --git a/routes/breadcrumbs.php b/routes/breadcrumbs.php
index a0ec3d2..63dc265 100644
--- a/routes/breadcrumbs.php
+++ b/routes/breadcrumbs.php
@@ -9,6 +9,22 @@
});
}
+ Breadcrumbs::for('basicdata.custom-field', function (BreadcrumbTrail $trail) {
+ $trail->parent('basicdata');
+ $trail->push('Custom Field', route('basicdata.custom-field.index'));
+ });
+
+ Breadcrumbs::for('basicdata.custom-field.create', function (BreadcrumbTrail $trail) {
+ $trail->parent('basicdata.custom-field');
+ $trail->push('Tambah Custom Field', route('basicdata.custom-field.create'));
+ });
+
+ Breadcrumbs::for('basicdata.custom-field.edit', function (BreadcrumbTrail $trail) {
+ $trail->parent('basicdata.custom-field');
+ $trail->push('Edit Custom Field');
+ });
+
+
Breadcrumbs::for('basicdata.jenis-fasilitas-kredit', function (BreadcrumbTrail $trail) {
$trail->parent('basicdata');
$trail->push('Jenis Fasilitas Kredit', route('basicdata.jenis-fasilitas-kredit.index'));
diff --git a/routes/web.php b/routes/web.php
index 5714df6..0b96766 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -3,7 +3,8 @@
use Illuminate\Support\Facades\Route;
use Modules\Lpj\Http\Controllers\ActivityController;
use Modules\Lpj\Http\Controllers\ArahMataAnginController;
-use Modules\Lpj\Http\Controllers\DebitureController;
+ use Modules\Lpj\Http\Controllers\CustomFieldController;
+ use Modules\Lpj\Http\Controllers\DebitureController;
use Modules\Lpj\Http\Controllers\DokumenJaminanController;
use Modules\Lpj\Http\Controllers\HubunganPemilikJaminanController;
use Modules\Lpj\Http\Controllers\HubunganPenghuniJaminanController;
@@ -51,6 +52,16 @@ Route::middleware(['auth'])->group(function () {
Route::get('api/check-penawaran/{nomor_registrasi}', [TenderController::class, 'checkPenawaranExistence']);
Route::name('basicdata.')->prefix('basic-data')->group(function () {
+
+ Route::name('custom-field.')->prefix('custom-field')->group(function () {
+ Route::get('restore/{id}', [CustomFieldController::class, 'restore'])->name('restore');
+ Route::get('datatables', [CustomFieldController::class, 'dataForDatatables'])->name(
+ 'datatables',
+ );
+ Route::get('export', [CustomFieldController::class, 'export'])->name('export');
+ });
+ Route::resource('custom-field', CustomFieldController::class);
+
Route::name('jenis-fasilitas-kredit.')->prefix('jenis-fasilitas-kredit')->group(function () {
Route::get('restore/{id}', [JenisFasilitasKreditController::class, 'restore'])->name('restore');
Route::get('datatables', [JenisFasilitasKreditController::class, 'dataForDatatables'])->name(
From 18cbb0bbc5e2c63317ea8e02963d174096477053 Mon Sep 17 00:00:00 2001
From: Daeng Deni Mardaeni
Date: Thu, 30 Jan 2025 16:14:48 +0700
Subject: [PATCH 03/33] feat(custom-field): tambahkan kolom label dan urutan
prioritas
- Menambahkan kolom 'label' pada tabel custom_fields.
- Menambahkan kolom 'urutan_prioritas' pada tabel custom_fields.
- Memperbarui model CustomField untuk menyertakan kolom baru.
- Memperbarui form input untuk label dan urutan prioritas di tampilan create dan index.
- Menambahkan validasi untuk label dan urutan prioritas di CustomFieldRequest.
---
.../Controllers/CustomFieldController.php | 271 +++++++++---------
app/Http/Requests/CustomFieldRequest.php | 25 ++
app/Models/CustomField.php | 4 +-
...rutan_prioritas_to_custom_fields_table.php | 28 ++
...91021_add_label_to_custom_fields_table.php | 28 ++
.../views/custom_fields/create.blade.php | 22 ++
resources/views/custom_fields/index.blade.php | 9 +-
7 files changed, 251 insertions(+), 136 deletions(-)
create mode 100644 database/migrations/2025_01_30_085835_add_urutan_prioritas_to_custom_fields_table.php
create mode 100644 database/migrations/2025_01_30_091021_add_label_to_custom_fields_table.php
diff --git a/app/Http/Controllers/CustomFieldController.php b/app/Http/Controllers/CustomFieldController.php
index ad41ee9..b42ab89 100644
--- a/app/Http/Controllers/CustomFieldController.php
+++ b/app/Http/Controllers/CustomFieldController.php
@@ -1,150 +1,153 @@
validated();
+ public function index()
+ {
+ return view('lpj::custom_fields.index');
+ }
- if ($validate) {
- try {
- // Save to database
- CustomField::create($validate);
- return redirect()
- ->route('basicdata.custom-field.index')
- ->with('success', 'Custom Field created successfully');
- } catch (Exception $e) {
- return redirect()
- ->route('basicdata.custom-field.create')
- ->with('error', $e->getMessage());
+ public function store(CustomFieldRequest $request)
+ {
+ $validate = $request->validated();
+
+ if ($validate) {
+ try {
+ // Save to database
+ CustomField::create($validate);
+ return redirect()
+ ->route('basicdata.custom-field.index')
+ ->with('success', 'Custom Field created successfully');
+ } catch (Exception $e) {
+ return redirect()
+ ->route('basicdata.custom-field.create')
+ ->with('error', $e->getMessage());
+ }
}
}
- }
- public function create()
- {
- return view('lpj::custom_fields.create');
- }
-
- public function edit($id)
- {
- $customField = CustomField::find($id);
- return view('lpj::custom_fields.create', compact('customField'));
- }
-
- public function update(CustomFieldRequest $request, $id)
- {
- $validate = $request->validated();
-
- if ($validate) {
- try {
- // Update in database
- $customField = CustomField::find($id);
- $customField->update($validate);
- return redirect()
- ->route('basicdata.custom-field.index')
- ->with('success', 'Custom Field updated successfully');
- } catch (Exception $e) {
- return redirect()
- ->route('basicdata.custom-field.edit', $id)
- ->with('error', 'Failed to update custom field');
- }
+ public function create()
+ {
+ $urutan_prioritas = CustomField::max('urutan_prioritas')+1;
+ return view('lpj::custom_fields.create', compact('urutan_prioritas'));
}
- }
- public function destroy($id)
- {
- try {
- // Delete from database
+ public function edit($id)
+ {
$customField = CustomField::find($id);
- $customField->delete();
+ $urutan_prioritas = $customField->urutan_prioritas ?? CustomField::max('urutan_prioritas')+1;
+ return view('lpj::custom_fields.create', compact('customField', 'urutan_prioritas' ));
+ }
- echo json_encode(['success' => true, 'message' => 'Custom Field deleted successfully']);
- } catch (Exception $e) {
- echo json_encode(['success' => false, 'message' => 'Failed to delete custom field']);
+ public function update(CustomFieldRequest $request, $id)
+ {
+ $validate = $request->validated();
+
+ if ($validate) {
+ try {
+ // Update in database
+ $customField = CustomField::find($id);
+ $customField->update($validate);
+ return redirect()
+ ->route('basicdata.custom-field.index')
+ ->with('success', 'Custom Field updated successfully');
+ } catch (Exception $e) {
+ return redirect()
+ ->route('basicdata.custom-field.edit', $id)
+ ->with('error', 'Failed to update custom field');
+ }
+ }
+ }
+
+ public function destroy($id)
+ {
+ try {
+ // Delete from database
+ $customField = CustomField::find($id);
+ $customField->delete();
+
+ echo json_encode(['success' => true, 'message' => 'Custom Field deleted successfully']);
+ } catch (Exception $e) {
+ echo json_encode(['success' => false, 'message' => 'Failed to delete custom field']);
+ }
+ }
+
+ public function dataForDatatables(Request $request)
+ {
+ if (is_null($this->user) || !$this->user->can('custom_fields.view')) {
+ //abort(403, 'Sorry! You are not allowed to view custom fields.');
+ }
+
+ // Retrieve data from the database
+ $query = CustomField::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('name', 'LIKE', "%$search%");
+ $q->orWhere('label', 'LIKE', "%$search%");
+ $q->orWhere('type', '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->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 CustomFieldExport, 'custom_fields.xlsx');
}
}
-
- public function dataForDatatables(Request $request)
- {
- if (is_null($this->user) || !$this->user->can('custom_fields.view')) {
- //abort(403, 'Sorry! You are not allowed to view custom fields.');
- }
-
- // Retrieve data from the database
- $query = CustomField::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('name', 'LIKE', "%$search%");
- $q->orWhere('type', '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->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 CustomFieldExport, 'custom_fields.xlsx');
- }
-}
diff --git a/app/Http/Requests/CustomFieldRequest.php b/app/Http/Requests/CustomFieldRequest.php
index 08c5740..0cf1cf8 100644
--- a/app/Http/Requests/CustomFieldRequest.php
+++ b/app/Http/Requests/CustomFieldRequest.php
@@ -3,6 +3,8 @@
namespace Modules\Lpj\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
+use Modules\Lpj\Models\customField;
+use Illuminate\Validation\Rule;
class CustomFieldRequest extends FormRequest
{
@@ -14,6 +16,12 @@ class CustomFieldRequest extends FormRequest
return [
'name' => 'required|max:255',
'type' => 'required|in:text,select,radio,checkbox',
+ 'label' => 'nullable|max:255',
+ 'urutan_prioritas' => [
+ 'nullable',
+ 'integer',
+ Rule::unique('custom_fields')->ignore($this->route('custom_field')),
+ ],
];
}
@@ -29,5 +37,22 @@ class CustomFieldRequest extends FormRequest
if(!$this->type){
$this->merge(['type' => 'text']);
}
+
+ if (!$this->urutan_prioritas) {
+ $maxPrioritas = CustomField::max('urutan_prioritas') ?? 0;
+ $this->merge(['urutan_prioritas' => $maxPrioritas + 1]);
+ }
+ }
+
+ /**
+ * Get custom messages for validator errors.
+ *
+ * @return array
+ */
+ public function messages()
+ {
+ return [
+ 'urutan_prioritas.unique' => 'Urutan prioritas sudah digunakan. Silakan pilih nomor lain.',
+ ];
}
}
diff --git a/app/Models/CustomField.php b/app/Models/CustomField.php
index 94c43be..8efcd66 100644
--- a/app/Models/CustomField.php
+++ b/app/Models/CustomField.php
@@ -14,7 +14,9 @@ class customField extends Base
*/
protected $fillable = [
'name',
- 'type'
+ 'type',
+ 'urutan_prioritas',
+ 'label'
];
// protected static function newFactory(): CustomFieldFactory
diff --git a/database/migrations/2025_01_30_085835_add_urutan_prioritas_to_custom_fields_table.php b/database/migrations/2025_01_30_085835_add_urutan_prioritas_to_custom_fields_table.php
new file mode 100644
index 0000000..f4250e3
--- /dev/null
+++ b/database/migrations/2025_01_30_085835_add_urutan_prioritas_to_custom_fields_table.php
@@ -0,0 +1,28 @@
+integer('urutan_prioritas')->nullable()->after('type');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('custom_fields', function (Blueprint $table) {
+ $table->dropColumn('urutan_prioritas');
+ });
+ }
+};
diff --git a/database/migrations/2025_01_30_091021_add_label_to_custom_fields_table.php b/database/migrations/2025_01_30_091021_add_label_to_custom_fields_table.php
new file mode 100644
index 0000000..39f8b30
--- /dev/null
+++ b/database/migrations/2025_01_30_091021_add_label_to_custom_fields_table.php
@@ -0,0 +1,28 @@
+string('label')->nullable()->after('name');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('custom_fields', function (Blueprint $table) {
+ $table->dropColumn('label');
+ });
+ }
+};
diff --git a/resources/views/custom_fields/create.blade.php b/resources/views/custom_fields/create.blade.php
index 31220b0..448cdb2 100644
--- a/resources/views/custom_fields/create.blade.php
+++ b/resources/views/custom_fields/create.blade.php
@@ -39,6 +39,17 @@
@enderror
+
+
+ Label
+
+
+
+ @error('label')
+ {{ $message }}
+ @enderror
+
+
Type
@@ -55,6 +66,17 @@
@enderror
+
+
+ Urutan Prioritas
+
+
+
+ @error('urutan_prioritas')
+ {{ $message }}
+ @enderror
+
+
Save
diff --git a/resources/views/custom_fields/index.blade.php b/resources/views/custom_fields/index.blade.php
index b6b128c..908c670 100644
--- a/resources/views/custom_fields/index.blade.php
+++ b/resources/views/custom_fields/index.blade.php
@@ -40,6 +40,10 @@
Type
+
+ Urutan Prioritas
+
+
Action
@@ -113,12 +117,15 @@
return checkbox.outerHTML.trim();
},
},
- name: {
+ label: {
title: 'Custom Field',
},
type: {
title: 'Type',
},
+ urutan_prioritas: {
+ title: 'Urutan Prioritas',
+ },
actions: {
title: 'Status',
render: (item, data) => {
From d746f53941d3ab6ffd4bf649c6e3600339a95aca Mon Sep 17 00:00:00 2001
From: Daeng Deni Mardaeni
Date: Thu, 30 Jan 2025 16:34:37 +0700
Subject: [PATCH 04/33] feat(jenis-legalitas-jaminan): tambahkan dukungan untuk
custom fields
- Menambahkan kolom 'custom_fields' pada tabel 'jenis_legalitas_jaminan'.
- Memperbarui model untuk mengizinkan pengisian 'custom_fields' sebagai array.
- Memperbarui request untuk validasi 'custom_fields' sebagai array.
- Memperbarui controller untuk mengambil dan mengirimkan custom fields saat membuat dan mengedit jenis legalitas jaminan.
---
.../JenisLegalitasJaminanController.php | 7 +-
.../Requests/JenisLegalitasJaminanRequest.php | 7 +
app/Models/JenisLegalitasJaminan.php | 11 +-
...ields_to_jenis_legalitas_jaminan_table.php | 28 +++
.../jenis_legalitas_jaminan/create.blade.php | 174 ++++++++++--------
5 files changed, 149 insertions(+), 78 deletions(-)
create mode 100644 database/migrations/2025_01_30_091713_add_custom_fields_to_jenis_legalitas_jaminan_table.php
diff --git a/app/Http/Controllers/JenisLegalitasJaminanController.php b/app/Http/Controllers/JenisLegalitasJaminanController.php
index 9c6f4e9..1bb1446 100644
--- a/app/Http/Controllers/JenisLegalitasJaminanController.php
+++ b/app/Http/Controllers/JenisLegalitasJaminanController.php
@@ -8,6 +8,7 @@
use Maatwebsite\Excel\Facades\Excel;
use Modules\Lpj\Exports\JenisLegalitasJaminanExport;
use Modules\Lpj\Http\Requests\JenisLegalitasJaminanRequest;
+ use Modules\Lpj\Models\customField;
use Modules\Lpj\Models\JenisLegalitasJaminan;
class JenisLegalitasJaminanController extends Controller
@@ -40,13 +41,15 @@
public function create()
{
- return view('lpj::jenis_legalitas_jaminan.create');
+ $customFields = CustomField::orderBy('urutan_prioritas', 'asc')->get();
+ return view('lpj::jenis_legalitas_jaminan.create',compact('customFields'));
}
public function edit($id)
{
$jenisLegalitasJaminan = JenisLegalitasJaminan::find($id);
- return view('lpj::jenis_legalitas_jaminan.create', compact('jenisLegalitasJaminan'));
+ $customFields = CustomField::orderBy('urutan_prioritas', 'asc')->get();
+ return view('lpj::jenis_legalitas_jaminan.create', compact('jenisLegalitasJaminan', 'customFields'));
}
public function update(JenisLegalitasJaminanRequest $request, $id)
diff --git a/app/Http/Requests/JenisLegalitasJaminanRequest.php b/app/Http/Requests/JenisLegalitasJaminanRequest.php
index 82fb205..b6ca8a1 100644
--- a/app/Http/Requests/JenisLegalitasJaminanRequest.php
+++ b/app/Http/Requests/JenisLegalitasJaminanRequest.php
@@ -20,6 +20,8 @@
'slug' => 'required|max:255',
'custom_field' => 'nullable|max:255',
'custom_field_type' => 'nullable|max:255',
+ 'custom_fields' => 'nullable|array',
+ 'custom_fields.*' => 'required|string|max:255',
];
}
@@ -46,5 +48,10 @@
'slug' => Str::slug($this->name),
]);
}
+
+ // Ensure custom_fields is always an array
+ if (!is_array($this->custom_fields)) {
+ $this->merge(['custom_fields' => []]);
+ }
}
}
diff --git a/app/Models/JenisLegalitasJaminan.php b/app/Models/JenisLegalitasJaminan.php
index dd8f840..aefba67 100644
--- a/app/Models/JenisLegalitasJaminan.php
+++ b/app/Models/JenisLegalitasJaminan.php
@@ -7,5 +7,14 @@
class JenisLegalitasJaminan extends Base
{
protected $table = 'jenis_legalitas_jaminan';
- protected $fillable = ['code', 'name','slug','custom_field','custom_field_type'];
+ protected $fillable = ['code', 'name','slug','custom_field','custom_field_type','custom_fields'];
+
+ protected $casts = [
+ 'custom_fields' => 'array',
+ ];
+
+ public function customFields()
+ {
+ return $this->hasMany(CustomField::class);
+ }
}
diff --git a/database/migrations/2025_01_30_091713_add_custom_fields_to_jenis_legalitas_jaminan_table.php b/database/migrations/2025_01_30_091713_add_custom_fields_to_jenis_legalitas_jaminan_table.php
new file mode 100644
index 0000000..b4ba94b
--- /dev/null
+++ b/database/migrations/2025_01_30_091713_add_custom_fields_to_jenis_legalitas_jaminan_table.php
@@ -0,0 +1,28 @@
+string('custom_fields')->nullable();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('jenis_legalitas_jaminan', function (Blueprint $table) {
+ $table->dropColumn('custom_fields');
+ });
+ }
+};
diff --git a/resources/views/jenis_legalitas_jaminan/create.blade.php b/resources/views/jenis_legalitas_jaminan/create.blade.php
index d8e273a..c0e6632 100644
--- a/resources/views/jenis_legalitas_jaminan/create.blade.php
+++ b/resources/views/jenis_legalitas_jaminan/create.blade.php
@@ -10,83 +10,107 @@
@endsection
From 92d0aff9f8cfbdb0ffe798b9dd5875827febfcd6 Mon Sep 17 00:00:00 2001
From: Daeng Deni Mardaeni
Date: Thu, 30 Jan 2025 20:49:34 +0700
Subject: [PATCH 05/33] feat(custom-field): tambahkan fungsi untuk mendapatkan
custom field
- Menambahkan fungsi getCustomField untuk mengambil custom field berdasarkan ID atau nama.
- Memperbarui penggunaan model customField di file Lpj.php.
---
app/Helpers/Lpj.php | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/app/Helpers/Lpj.php b/app/Helpers/Lpj.php
index 6a778a0..56da2f3 100644
--- a/app/Helpers/Lpj.php
+++ b/app/Helpers/Lpj.php
@@ -2,7 +2,8 @@
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
-use Modules\Lpj\Models\HolidayCalendar;
+ use Modules\Lpj\Models\customField;
+ use Modules\Lpj\Models\HolidayCalendar;
use Modules\Lpj\Models\PenawaranDetailTender;
use Modules\Lpj\Models\PenawaranTender;
use Modules\Lpj\Models\Penilaian;
@@ -359,3 +360,16 @@ function getNomorLaporan($permohonanId, $documentId){
])->first();
return $laporan->nomor_laporan ?? null;
}
+
+function getCustomField($param){
+ if(is_numeric($param)){
+ $field = CustomField::find($param);
+ } else {
+ $field = CustomField::where(['name' => $param])->first();
+ }
+ if($field){
+ return $field;
+ } else {
+ return null;
+ }
+}
From b9d6e5a95ba9c20a1a764c9aee140b4e5711f2fc Mon Sep 17 00:00:00 2001
From: Daeng Deni Mardaeni
Date: Thu, 30 Jan 2025 20:50:00 +0700
Subject: [PATCH 06/33] feat(dokumen-jaminan): perbaiki pengambilan custom
field
- Memperbaiki pengambilan custom field pada dokumen jaminan.
- Mengubah logika untuk mendapatkan custom field berdasarkan ID yang benar.
- Menambahkan pengambilan custom fields yang terkait dengan jenis legalitas jaminan.
---
.../Controllers/DokumenJaminanController.php | 12 +-
.../debitur/components/dokumen.blade.php | 122 ++++++++----------
2 files changed, 64 insertions(+), 70 deletions(-)
diff --git a/app/Http/Controllers/DokumenJaminanController.php b/app/Http/Controllers/DokumenJaminanController.php
index 78a11c2..f272eaa 100644
--- a/app/Http/Controllers/DokumenJaminanController.php
+++ b/app/Http/Controllers/DokumenJaminanController.php
@@ -14,6 +14,7 @@
use Modules\Location\Models\Province;
use Modules\Location\Models\Village;
use Modules\Lpj\Http\Requests\DokumenJaminanRequest;
+ use Modules\Lpj\Models\customField;
use Modules\Lpj\Models\Debiture;
use Modules\Lpj\Models\DetailDokumenJaminan;
use Modules\Lpj\Models\DokumenJaminan;
@@ -88,7 +89,7 @@
'jenis_legalitas_jaminan_id' => $value,
'name' => $request->name[$key],
'keterangan' => $request->keterangan[$key],
- 'details' => isset($request->custom_field[$key]) ? json_encode($request->custom_field[$key]) : ''
+ 'details' => isset($request->custom_field[$value]) ? json_encode($request->custom_field[$value]) : ''
];
$dokumenJaminan = [];
@@ -247,7 +248,7 @@
'jenis_legalitas_jaminan_id' => $value,
'name' => $request->name[$key],
'keterangan' => $request->keterangan[$key],
- 'details' => isset($request->custom_field[$key]) ? json_encode($request->custom_field[$key]) : ''
+ 'details' => isset($request->custom_field[$value]) ? json_encode($request->custom_field[$value]) : ''
];
$dokumenJaminan = [];
@@ -496,6 +497,12 @@
foreach ($document->detail as $detail) {
// Only include existing legalitas if its id is in the new set
if (in_array($detail->jenis_legalitas_jaminan_id, $newLegalitasIds)) {
+ $customFields = [];
+ if($detail->jenisLegalitasJaminan->custom_fields) {
+ $customFields = CustomField::whereIn('id', $detail->jenisLegalitasJaminan->custom_fields)
+ ->get();
+ }
+
$existingLegalitas[] = [
'id' => $detail->id,
'jenis_legalitas_jaminan_id' => $detail->jenis_legalitas_jaminan_id,
@@ -507,6 +514,7 @@
$detail->dokumen_nomor,
) ?? $detail->dokumen_nomor,
'custom_field' => $detail->jenisLegalitasJaminan->custom_field,
+ 'custom_fields' => $customFields,
'custom_field_type' => $detail->jenisLegalitasJaminan->custom_field_type,
'details' => $detail->details,
'keterangan' => $detail->keterangan,
diff --git a/resources/views/debitur/components/dokumen.blade.php b/resources/views/debitur/components/dokumen.blade.php
index ed7805f..80cd597 100644
--- a/resources/views/debitur/components/dokumen.blade.php
+++ b/resources/views/debitur/components/dokumen.blade.php
@@ -16,16 +16,16 @@
-
-
- Nomor Permohonan
-
-
-
- {{ $permohonan->nomor_registrasi ?? "-" }}
-
-
+
+
+ Nomor Permohonan
+
+
+
+ {{ $permohonan->nomor_registrasi ?? "-" }}
+
+
Pemilik Jaminan
@@ -314,38 +314,32 @@
@if($detail->details)
- @if($detail->jenisLegalitasJaminan->custom_field)
- @php $custom_field = json_decode($detail->details,true) @endphp
-
-
- {{ str_replace('_',' ',$detail->jenisLegalitasJaminan->custom_field) }}
-
-
-
+ @if($detail->jenisLegalitasJaminan->custom_fields)
+ @php $custom_field = json_decode($detail->details) @endphp
+ {{ $custom_field->luas_tanah }}
+ @foreach($custom_field as $key => $value)
+
+
+ {{ getCustomField($key)->label ?? "" }}
+
+
+
+
-
+ @endforeach
@endif
-
@else
- @if($detail->jenisLegalitasJaminan->custom_field)
-
-
- {{ str_replace('_',' ',$detail->jenisLegalitasJaminan->custom_field) }}
-
-
+ @endforeach
@endif
@endif
@@ -393,25 +387,17 @@
- @if($item->custom_field)
-
-
- {{ str_replace('_',' ',$item->custom_field) }}
-
-
+ @endforeach
@endif
@@ -437,13 +423,13 @@
@push('scripts')
{{--Pemilik Jaminan--}}
From cae62db0dfe31072adabde5b7677c137c004f81c Mon Sep 17 00:00:00 2001
From: Daeng Deni Mardaeni
Date: Thu, 30 Jan 2025 20:50:16 +0700
Subject: [PATCH 07/33] fix(penawaran): perbaiki pengambilan luas tanah dan
luas bangunan
- Sederhanakan kondisi untuk memeriksa dan mengambil nilai luas tanah dan luas bangunan.
- Ganti penggunaan notasi objek dengan notasi akses langsung untuk meningkatkan keterbacaan.
- Hapus kondisi yang tidak perlu untuk meningkatkan efisiensi kode.
---
.../views/penawaran/kirimEmail.blade.php | 178 +++++++++---------
.../views/penawaran/kirimEmailKJPP.blade.php | 14 +-
.../views/penawaran/surat_tender.blade.php | 18 +-
.../penawaran/surat_tender_download.blade.php | 14 +-
.../penawaran/surat_tender_kjpp.blade.php | 22 +--
.../surat_tender_kjpp_download.blade.php | 176 +++++++++--------
6 files changed, 196 insertions(+), 226 deletions(-)
diff --git a/resources/views/penawaran/kirimEmail.blade.php b/resources/views/penawaran/kirimEmail.blade.php
index fa42b41..a4238b4 100644
--- a/resources/views/penawaran/kirimEmail.blade.php
+++ b/resources/views/penawaran/kirimEmail.blade.php
@@ -56,8 +56,8 @@
-
- Dear
+
+ Dear
@php
$allPeople = [];
@@ -76,7 +76,7 @@
}
}
}
- } catch (\Exception $e) {
+ } catch (Exception $e) {
// Handle invalid JSON silently
}
}
@@ -85,104 +85,100 @@
$allPeople = array_filter($allPeople);
$totalPeople = count($allPeople);
@endphp
- @if ($totalPeople > 0)
- @foreach ($allPeople as $index => $person)
- {{ $person }}{{ $index === $totalPeople - 2 ? ' dan ' : ($index < $totalPeople - 2 ? ' , ' : '') }}
- @endforeach
- @else
- Tidak Ada
- @endif
+ @if ($totalPeople > 0)
+ @foreach ($allPeople as $index => $person)
+ {{ $person }}{{ $index === $totalPeople - 2 ? ' dan ' : ($index < $totalPeople - 2 ? ' , ' : '') }}
+ @endforeach
+ @else
+ Tidak Ada
+ @endif
-
- Mohon untuk dibuatkan proposal jasa appraisal atas nama {{ $permohonan->debiture->name }} , tujuan penilaian untuk {{ $penawaran->tujuanPenilaianKJPP->name }} , laporan dalam bentuk {{ $penawaran->jenisLaporan->name }} , dengan data-data sebagai berikut:
-
+
+ Mohon untuk dibuatkan proposal jasa appraisal atas nama {{ $permohonan->debiture->name }} , tujuan penilaian untuk {{ $penawaran->tujuanPenilaianKJPP->name }} , laporan dalam bentuk {{ $penawaran->jenisLaporan->name }} , dengan data-data sebagai berikut:
+
-
- Aset Jaminan: @foreach ($permohonan->debiture->documents as $document)
- {{ $document->jenisJaminan->name }}
- @endforeach
-
Lokasi Jaminan: @foreach ($permohonan->debiture->documents as $document)
- {{ $document->address }}, Kel. @foreach ($villages as $village)
- {{ $village->name }}
- @endforeach, Kec. @foreach ($districts as $district)
- {{ $district->name }}
- @endforeach,@foreach ($cities as $city)
- {{ ucwords(strtolower($city->name)) }}
- @endforeach,@foreach ($provinces as $province)
- {{ $province->name }}
- @endforeach
- @endforeach
-
-
- Luas Tanah / Luas Bangunan:
- @php
- $luas_tanah = null;
- $luas_bangunan = null;
- @endphp
-
- @foreach ($permohonan->debiture->documents as $document)
- @foreach ($document->detail as $detail)
- @php
- $details = json_decode($detail->details);
- @endphp
-
- @if (is_object($details))
- @if (
- $detail->jenisLegalitasJaminan->custom_field === 'luas_tanah' &&
- isset($details->{'luas_tanah'}) &&
- is_numeric($details->{'luas_tanah'}))
- @php
- $luas_tanah = $details->{'luas_tanah'};
- @endphp
- @endif
-
- @if (
- $detail->jenisLegalitasJaminan->custom_field === 'luas_bangunan' &&
- isset($details->{'luas_bangunan'}) &&
- is_numeric($details->{'luas_bangunan'}))
- @php
- $luas_bangunan = $details->{'luas_bangunan'};
- @endphp
- @endif
- @endif
+
+ Aset Jaminan: @foreach ($permohonan->debiture->documents as $document)
+ {{ $document->jenisJaminan->name }}
+ @endforeach
+ Lokasi Jaminan: @foreach ($permohonan->debiture->documents as $document)
+ {{ $document->address }}, Kel. @foreach ($villages as $village)
+ {{ $village->name }}
+ @endforeach, Kec. @foreach ($districts as $district)
+ {{ $district->name }}
+ @endforeach,@foreach ($cities as $city)
+ {{ ucwords(strtolower($city->name)) }}
+ @endforeach,@foreach ($provinces as $province)
+ {{ $province->name }}
@endforeach
@endforeach
+
- @if ($luas_tanah !== null && $luas_bangunan !== null)
- {{ $luas_tanah }} m2 / {{ $luas_bangunan }} m2
- @elseif ($luas_tanah !== null)
- {{ $luas_tanah }} m2
- @elseif ($luas_bangunan !== null)
- {{ $luas_bangunan }} m2
- @endif
-
+ Luas Tanah / Luas Bangunan:
+ @php
+ $luas_tanah = null;
+ $luas_bangunan = null;
+ @endphp
-
- Harap proposal dibuat dengan harga yang minimal sehingga tidak perlu tawar menawar lagi.
- Mohon proposal dapat saya terima segera, sebelum {{ formatTanggalIndonesia($penawaran->end_date, true) }}
-
+ @foreach ($permohonan->debiture->documents as $document)
+ @foreach ($document->detail as $detail)
+ @php
+ $details = json_decode($detail->details);
+ @endphp
-
- Best Regards,
-
-
- {{ $permohonan->user->name }}
-
-
+ @if (is_object($details))
+ @if(isset($details->luas_tanah) && is_numeric($details->luas_tanah))
+ )
+ @php
+ $luas_tanah = $details->luas_tanah;
+ @endphp
+ @endif
-
+ @if(isset($details->luas_bangunan) && is_numeric($details->luas_bangunan))
+ )
+ @php
+ $luas_bangunan = $details->luas_bangunan;
+ @endphp
+ @endif
+ @endif
+ @endforeach
+ @endforeach
+
+ @if ($luas_tanah !== null && $luas_bangunan !== null)
+ {{ $luas_tanah }} m
2 / {{ $luas_bangunan }} m
2
+ @elseif ($luas_tanah !== null)
+ {{ $luas_tanah }} m
2
+ @elseif ($luas_bangunan !== null)
+ {{ $luas_bangunan }} m
2
+ @endif
+
+
+ Harap proposal dibuat dengan harga yang minimal sehingga tidak perlu tawar menawar lagi.
+ Mohon proposal dapat saya terima segera, sebelum {{ formatTanggalIndonesia($penawaran->end_date, true) }}
+
+
+
+ Best Regards,
+
+
+ {{ $permohonan->user->name }}
+
+
+
+
+