feat: Tambah kolom nomor tiket dan perbaiki null safety NOC

- Tambahkan kolom 'nomor_tiket' di tabel NOC (index, pembayaran, penyelesaian)
- Perbaiki null safety dengan operator ?-> untuk mencegah error
- Update model Noc: ganti fillable dengan guarded, tambah relasi debiture & branch
- Hapus filter whereDoesntHave untuk memo_penyelesaian (commented out)
- Tambah fallback data dari noc->debiture dan noc->branch
- Perbaiki sorting dengan ->values() untuk reset array keys
- Update view pembayaran.blade.php dengan kolom nomor tiket
This commit is contained in:
Daeng Deni Mardaeni
2025-09-15 12:52:14 +07:00
parent 4aeecf6a97
commit c08e050815
6 changed files with 232 additions and 226 deletions

View File

@@ -220,9 +220,9 @@
$query = PersetujuanPenawaran::query();
// Filter for pembayaran (where memo_penyelesaian is null)
$query->whereDoesntHave('noc', function($q) {
/*$query->whereDoesntHave('noc', function($q) {
$q->whereNotNull('memo_penyelesaian');
});
});*/
// Apply search filter if provided
if ($request->has('search') && !empty($request->get('search'))) {
@@ -260,10 +260,11 @@
$data = $data->map(function ($persetujuanPenawaran) {
return [
'id' => $persetujuanPenawaran->id,
'nomor_registrasi' => $persetujuanPenawaran->permohonan->nomor_registrasi ?? $persetujuanPenawaran->penawaran->nomor_registrasi,
'nama_debitur' => $persetujuanPenawaran->permohonan->debiture->name ?? $persetujuanPenawaran->penawaran->permohonan->debiture->name,
'kode_cabang' => $persetujuanPenawaran->permohonan->branch->code ?? $persetujuanPenawaran->penawaran->permohonan->branch->code,
'cabang' => $persetujuanPenawaran->permohonan->branch->name ?? $persetujuanPenawaran->penawaran->permohonan->branch->name,
'nomor_registrasi' => $persetujuanPenawaran->permohonan?->nomor_registrasi ?? $persetujuanPenawaran->penawaran?->nomor_registrasi,
'nomor_tiket' => $persetujuanPenawaran->nomor_tiket ?? '',
'nama_debitur' => $persetujuanPenawaran?->permohonan?->debiture->name ?? $persetujuanPenawaran->penawaran?->permohonan?->debiture->name ?? $persetujuanPenawaran->noc?->debiture->name,
'kode_cabang' => $persetujuanPenawaran?->permohonan?->branch->code ?? $persetujuanPenawaran->penawaran?->permohonan?->branch->code ?? $persetujuanPenawaran->noc?->branch->code,
'cabang' => $persetujuanPenawaran?->permohonan?->branch->name ?? $persetujuanPenawaran->penawaran?->permohonan?->branch->name ?? $persetujuanPenawaran->noc?->branch->name,
'tanggal_pembayaran' => dateFormat(
$persetujuanPenawaran->noc->tanggal_pembayaran ?? $persetujuanPenawaran->noc?->created_at,
true,
@@ -347,9 +348,11 @@
$data = $data->map(function ($persetujuanPenawaran) {
return [
'id' => $persetujuanPenawaran->id,
'nomor_registrasi' => $persetujuanPenawaran->permohonan->nomor_registrasi ?? $persetujuanPenawaran->penawaran->nomor_registrasi,
'nama_debitur' => $persetujuanPenawaran->permohonan->debiture->name ?? $persetujuanPenawaran->penawaran->permohonan->debiture->name,
'cabang' => $persetujuanPenawaran->permohonan->branch->name ?? $persetujuanPenawaran->penawaran->permohonan->branch->name,
'nomor_registrasi' => $persetujuanPenawaran->permohonan?->nomor_registrasi ?? $persetujuanPenawaran->penawaran?->nomor_registrasi ?? '',
'nomor_tiket' => $persetujuanPenawaran->nomor_tiket ?? '',
'nama_debitur' => $persetujuanPenawaran->permohonan->debiture->name ?? $persetujuanPenawaran->penawaran->permohonan->debiture->name ?? $persetujuanPenawaran->noc->debiture->name,
'kode_cabang' => $persetujuanPenawaran?->permohonan?->branch->code ?? $persetujuanPenawaran->penawaran?->permohonan?->branch->code ?? $persetujuanPenawaran->noc?->branch->code,
'cabang' => $persetujuanPenawaran->permohonan->branch->name ?? $persetujuanPenawaran->penawaran->permohonan->branch->name ?? $persetujuanPenawaran->noc?->branch->name,
'tanggal_pembayaran' => dateFormat(
$persetujuanPenawaran->noc->tanggal_pembayaran ?? $persetujuanPenawaran->noc?->created_at,
true,
@@ -371,7 +374,7 @@
true) : '-',
'updated_at' => dateFormat($persetujuanPenawaran->updated_at, true),
];
})->sortBy('updated_at', 1);
})->sortBy('updated_at', 1)->values();
// Calculate the page count
$pageCount = ceil($totalRecords / $request->get('size'));

View File

@@ -8,39 +8,7 @@ class Noc extends Base
{
protected $table = 'noc';
protected $fillable = [
'permohonan_id',
'persetujuan_penawaran_id',
'nomor_tiket',
'bukti_bayar',
'nominal_bayar',
'total_pembukuan',
'status_bayar',
'status_kurang_bayar',
'nominal_kurang_bayar',
'status_lebih_bayar',
'nominal_lebih_bayar',
'bukti_pengembalian',
'tanggal_pembayaran',
'nominal_penyelesaian',
'status_penyelesaiaan',
'tanggal_penyelesaian',
'bukti_penyelesaian',
'bukti_ksl',
'memo_penyelesaian',
'memo_penyelesaian_number',
'memo_penyelesaian_date',
'memo_penyelesaian_payment_date',
'memo_penyelesaian_created_at',
'catatan_noc',
'status',
'authorized_status',
'authorized_at',
'authorized_by',
'nomor_rekening_lebih_bayar',
'bukti_ksl_lebih_bayar',
'bukti_ksl_kurang_bayar'
];
protected $guarded = ['id'];
protected $casts = [
'nominal_bayar' => 'decimal:2',
@@ -78,4 +46,12 @@ class Noc extends Base
{
return $this->belongsTo(User::class, 'authorized_by');
}
public function debiture(){
return $this->belongsTo(Debiture::class,'debiture_id');
}
public function branch(){
return $this->belongsTo(Branch::class,'branch_id');
}
}

View File

@@ -39,6 +39,10 @@
<span class="sort"> <span class="sort-label"> Nomor Registrasi </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nomor_tiket">
<span class="sort"> <span class="sort-label"> Nomor Tiket </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nama_debitur">
<span class="sort"> <span class="sort-label"> Nama Debitur </span>
<span class="sort-icon"> </span> </span>
@@ -151,6 +155,9 @@
nomor_registrasi: {
title: 'Nomor Registrasi'
},
nomor_tiket: {
title: 'Nomor Tiket'
},
nama_debitur: {
title: 'Nama Debitur',
},

View File

@@ -39,6 +39,10 @@
<span class="sort"> <span class="sort-label"> Nomor Registrasi </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nomor_tiket">
<span class="sort"> <span class="sort-label"> Nomor Tiket </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nama_debitur">
<span class="sort"> <span class="sort-label"> Nama Debitur </span>
<span class="sort-icon"> </span> </span>
@@ -135,6 +139,9 @@
nomor_registrasi: {
title: 'Nomor Registrasi'
},
nomor_tiket: {
title: 'Nomor Tiket'
},
nama_debitur: {
title: 'Nama Debitur',
},

View File

@@ -5,9 +5,10 @@
@endsection
@section('content')
<div class="w-full grid gap-5 lg:gap-7.5 mx-auto">
<div class="card border border-agi-100 card-grid min-w-full" data-datatable="false" data-datatable-page-size="10" data-datatable-state-save="false" id="noc-table" data-api-url="{{ route('noc.datatables.penyelesaian') }}">
<div class="card-header bg-agi-50 py-5 flex-wrap">
<div class="grid gap-5 mx-auto w-full lg:gap-7.5">
<div class="min-w-full border card border-agi-100 card-grid" data-datatable="false" data-datatable-page-size="10"
data-datatable-state-save="false" id="noc-table" data-api-url="{{ route('noc.datatables.penyelesaian') }}">
<div class="flex-wrap py-5 card-header bg-agi-50">
<h3 class="card-title">
Daftar NOC Penyelesaian
</h3>
@@ -27,16 +28,21 @@
<div class="card-body">
<div class="scrollable-x-auto">
<table class="table table-auto table-border align-middle text-gray-700 font-medium text-sm" data-datatable-table="true">
<table class="table text-sm font-medium text-gray-700 align-middle table-auto table-border"
data-datatable-table="true">
<thead>
<tr>
<th class="w-14">
<input class="checkbox checkbox-sm" data-datatable-check="true" type="checkbox"/>
<input class="checkbox checkbox-sm" data-datatable-check="true" type="checkbox" />
</th>
<th class="min-w-[150px]" data-datatable-column="nomor_registrasi">
<span class="sort"> <span class="sort-label"> Nomor Registrasi </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nomor_tiket">
<span class="sort"> <span class="sort-label"> Nomor Tiket </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nama_debitur">
<span class="sort"> <span class="sort-label"> Nama Debitur </span>
<span class="sort-icon"> </span> </span>
@@ -91,13 +97,13 @@
</table>
</div>
<div
class="card-footer justify-center md:justify-between flex-col md:flex-row gap-3 text-gray-600 text-2sm font-medium">
<div class="flex items-center gap-2">
class="flex-col gap-3 justify-center font-medium text-gray-600 card-footer md:justify-between md:flex-row text-2sm">
<div class="flex gap-2 items-center">
Show
<select class="select select-sm w-16" data-datatable-size="true" name="perpage"> </select> per
<select class="w-16 select select-sm" data-datatable-size="true" name="perpage"> </select> per
page
</div>
<div class="flex items-center gap-4">
<div class="flex gap-4 items-center">
<span data-datatable-info="true"> </span>
<div class="pagination" data-datatable-pagination="true">
</div>
@@ -149,11 +155,17 @@
nomor_registrasi: {
title: 'Nomor Registrasi'
},
nomor_tiket: {
title: 'Nomor Tiket',
},
nama_debitur: {
title: 'Nama Debitur',
},
cabang: {
title: 'Cabang',
render: (item, data) => {
return data.kode_cabang + ' - ' + data.cabang;
}
},
tanggal_setor: {
title: 'Tanggal Setor',
@@ -236,7 +248,7 @@
let dataTable = new KTDataTable(element, dataTableOptions);
// Custom search functionality
searchInput.addEventListener('input', function () {
searchInput.addEventListener('input', function() {
const searchValue = this.value.trim();
dataTable.search(searchValue, true);
});

View File

@@ -131,6 +131,7 @@ Route::middleware(['auth'])->group(function () {
Route::controller(PembayaranController::class)->group(function () {
Route::get('/pembayaran', 'index')->name('pembayaran.index');
Route::get('/pembayaran/create', 'create')->name('pembayaran.create');
Route::get('/pembayaran/kurang', 'kurang')->name('pembayaran.kurang.index');
Route::get('/pembayaran/lebih', 'lebih')->name('pembayaran.lebih.index');
Route::get('/pembayaran/{pembayaran}/edit', 'edit')->name('pembayaran.edit');