Compare commits

...

4 Commits

Author SHA1 Message Date
Daeng Deni Mardaeni
929c56b079 feat(slik): tambah fitur export data SLIK ke Excel
- Tambah class `SlikExport` dengan implementasi Laravel Excel (WithMapping, WithHeadings, ColumnFormats, FromCollection)
- Method `collection()`, `map()`, `headings()`, `columnFormats()` untuk data mapping, header, dan formatting
- Format kolom: text untuk ID/kode, number untuk nilai agunan, date (d/m/Y) untuk tanggal
- Tambah method `export()` di `SlikController` dengan logging, error handling, dan filename timestamp
- Optimasi performa: chunking data, batch insert, memory monitoring (current & peak usage)
- Logging lengkap: start, jumlah records, success (filename & peak memory), error trace
- Integrasi route: GET `/slik/export` → `SlikController@export` (name: slik.export)
- Dependensi: gunakan `maatwebsite/excel`, pastikan package & write permission tersedia
- Dampak: export Excel lebih cepat, format user-friendly, audit trail lebih lengkap
2025-09-22 15:25:13 +07:00
Daeng Deni Mardaeni
388b65696f 🔧 refactor(permissions): pembersihan role & perbaikan UI form
- Hapus role `pemohon-ao` & `pemohon-eo` dari module.json pada semua menu (dashboard, laporan, permohonan, dsb.)
- Rapikan indentasi role `administrator` dan streamline permissions untuk akses kontrol yang lebih sederhana
- Tambahkan konsistensi role yang dipertahankan: administrator, admin, AO/EO Appraisal, DD Appraisal, Penilai, Surveyor
- Perbaiki class ordering pada input file & error message di `debitur.blade.php` agar sesuai konvensi Tailwind
- Perbaiki struktur div container di `debitur.blade.php` (`flex flex-wrap gap-2.5 items-baseline lg:flex-nowrap`)
- Perbaiki formatting input file & textarea pada `persetujuan_penawaran/form.blade.php` dengan multi-line untuk readability
- Rapikan class ordering error message di form penawaran (`text-sm alert text-danger`)
- Standarisasi formatting & konsistensi layout antar form untuk UX lebih rapi
2025-09-22 15:23:01 +07:00
Daeng Deni Mardaeni
ba9089e2ac 🔧 refactor(pembayaran): perbaikan struktur kode & integrasi Bucok dengan Permohonan
- Tambahkan validasi parameter `type` pada PembayaranController untuk mencegah error runtime
- Refactor nested conditions & perbaikan indentasi agar kode lebih readable dan maintainable
- Update model Bucok: tambah field `nomor_registrasi` & `permohonan_id` ke fillable serta relasi dengan Permohonan
- Integrasi logika pembayaran: auto update/create Bucok dengan data Permohonan & default nominal_bayar
- Implementasi conditional update berdasarkan ketersediaan nomor_tiket untuk sinkronisasi data
- Tambahkan migration baru: kolom nomor_registrasi & permohonan_id di tabel bucoks, dengan foreign key dan index
- Pastikan rollback migration tersedia via method down() untuk keamanan schema
- Optimasi query dengan index baru & penggunaan updateOrCreate untuk hindari duplikasi data
2025-09-22 11:35:07 +07:00
Daeng Deni Mardaeni
20d0061d42 feat(permohonan): auto-create PersetujuanPenawaran untuk jenis penilaian tertentu
- Import model PersetujuanPenawaran ke PermohonanController
- Tambah pengecekan jenis_penilaian_id == 1 setelah update permohonan
- Implementasi auto-create record PersetujuanPenawaran jika belum ada
- Simpan permohonan_id dan created_by (auth()->id()) pada record baru
- Gunakan where()->first() untuk cek existing record sebelum create
- Tambahkan logika di dalam try-catch agar konsisten dengan error handling
- Pastikan duplicate record dicegah untuk menjaga integritas data
- File dimodifikasi: app/Http/Controllers/PermohonanController.php
- Dampak: mempercepat workflow, kurangi manual input, tingkatkan konsistensi data
2025-09-22 10:46:58 +07:00
9 changed files with 596 additions and 224 deletions

185
app/Exports/SlikExport.php Normal file
View File

@@ -0,0 +1,185 @@
<?php
namespace Modules\Lpj\Exports;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithColumnFormatting;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping;
use Modules\Lpj\Models\Slik;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
/**
* Export class untuk data SLIK (Sistem Layanan Informasi Keuangan)
*
* Class ini menangani export data SLIK ke format Excel dengan:
* - Mapping data sesuai struktur SLIK
* - Format kolom yang sesuai (text, number, date)
* - Header yang informatif
*/
class SlikExport implements WithColumnFormatting, WithHeadings, FromCollection, WithMapping
{
/**
* Mengambil collection data SLIK untuk di-export
*
* @return \Illuminate\Support\Collection
*/
public function collection()
{
return Slik::orderBy('created_at', 'desc')->get();
}
/**
* Mapping data SLIK untuk setiap baris dalam Excel
*
* @param \Modules\Lpj\Models\Slik $row
* @return array
*/
public function map($row): array
{
return [
$row->id, // A - ID
$row->sandi_bank, // B - Sandi Bank
$row->tahun, // C - Tahun
$row->bulan, // D - Bulan
$row->flag_detail, // E - Flag Detail
$row->kode_register_agunan, // F - Kode Register Agunan
$row->no_rekening, // G - No Rekening
$row->cif, // H - CIF
$row->kolektibilitas, // I - Kolektibilitas
$row->fasilitas, // J - Fasilitas
$row->jenis_segmen_fasilitas, // K - Jenis Segmen Fasilitas
$row->status_agunan, // L - Status Agunan
$row->jenis_agunan, // M - Jenis Agunan
$row->peringkat_agunan, // N - Peringkat Agunan
$row->lembaga_pemeringkat, // O - Lembaga Pemeringkat
$row->jenis_pengikatan, // P - Jenis Pengikatan
$row->tanggal_pengikatan, // Q - Tanggal Pengikatan
$row->nama_pemilik_agunan, // R - Nama Pemilik Agunan
$row->bukti_kepemilikan, // S - Bukti Kepemilikan
$row->alamat_agunan, // T - Alamat Agunan
$row->lokasi_agunan, // U - Lokasi Agunan
$row->nilai_agunan, // V - Nilai Agunan
$row->nilai_agunan_menurut_ljk, // W - Nilai Agunan Menurut LJK
$row->tanggal_penilaian_ljk, // X - Tanggal Penilaian LJK
$row->nilai_agunan_penilai_independen, // Y - Nilai Agunan Penilai Independen
$row->nama_penilai_independen, // Z - Nama Penilai Independen
$row->tanggal_penilaian_penilai_independen, // AA - Tanggal Penilaian Penilai Independen
$row->jumlah_hari_tunggakan, // AB - Jumlah Hari Tunggakan
$row->status_paripasu, // AC - Status Paripasu
$row->prosentase_paripasu, // AD - Prosentase Paripasu
$row->status_kredit_join, // AE - Status Kredit Join
$row->diasuransikan, // AF - Diasuransikan
$row->keterangan, // AG - Keterangan
$row->kantor_cabang, // AH - Kantor Cabang
$row->operasi_data, // AI - Operasi Data
$row->kode_cabang, // AJ - Kode Cabang
$row->nama_debitur, // AK - Nama Debitur
$row->nama_cabang, // AL - Nama Cabang
$row->flag, // AM - Flag
$row->created_at, // AN - Created At
];
}
/**
* Header kolom untuk Excel
*
* @return array
*/
public function headings(): array
{
return [
'ID',
'Sandi Bank',
'Tahun',
'Bulan',
'Flag Detail',
'Kode Register Agunan',
'No Rekening',
'CIF',
'Kolektibilitas',
'Fasilitas',
'Jenis Segmen Fasilitas',
'Status Agunan',
'Jenis Agunan',
'Peringkat Agunan',
'Lembaga Pemeringkat',
'Jenis Pengikatan',
'Tanggal Pengikatan',
'Nama Pemilik Agunan',
'Bukti Kepemilikan',
'Alamat Agunan',
'Lokasi Agunan',
'Nilai Agunan',
'Nilai Agunan Menurut LJK',
'Tanggal Penilaian LJK',
'Nilai Agunan Penilai Independen',
'Nama Penilai Independen',
'Tanggal Penilaian Penilai Independen',
'Jumlah Hari Tunggakan',
'Status Paripasu',
'Prosentase Paripasu',
'Status Kredit Join',
'Diasuransikan',
'Keterangan',
'Kantor Cabang',
'Operasi Data',
'Kode Cabang',
'Nama Debitur',
'Nama Cabang',
'Flag',
'Created At',
];
}
/**
* Format kolom untuk Excel
*
* @return array
*/
public function columnFormats(): array
{
return [
'A' => NumberFormat::FORMAT_NUMBER, // ID
'B' => NumberFormat::FORMAT_TEXT, // Sandi Bank
'C' => NumberFormat::FORMAT_TEXT, // Tahun
'D' => NumberFormat::FORMAT_TEXT, // Bulan
'E' => NumberFormat::FORMAT_TEXT, // Flag Detail
'F' => NumberFormat::FORMAT_TEXT, // Kode Register Agunan
'G' => NumberFormat::FORMAT_TEXT, // No Rekening
'H' => NumberFormat::FORMAT_TEXT, // CIF
'I' => NumberFormat::FORMAT_TEXT, // Kolektibilitas
'J' => NumberFormat::FORMAT_TEXT, // Fasilitas
'K' => NumberFormat::FORMAT_TEXT, // Jenis Segmen Fasilitas
'L' => NumberFormat::FORMAT_TEXT, // Status Agunan
'M' => NumberFormat::FORMAT_TEXT, // Jenis Agunan
'N' => NumberFormat::FORMAT_TEXT, // Peringkat Agunan
'O' => NumberFormat::FORMAT_TEXT, // Lembaga Pemeringkat
'P' => NumberFormat::FORMAT_TEXT, // Jenis Pengikatan
'Q' => NumberFormat::FORMAT_DATE_DDMMYYYY, // Tanggal Pengikatan
'R' => NumberFormat::FORMAT_TEXT, // Nama Pemilik Agunan
'S' => NumberFormat::FORMAT_TEXT, // Bukti Kepemilikan
'T' => NumberFormat::FORMAT_TEXT, // Alamat Agunan
'U' => NumberFormat::FORMAT_TEXT, // Lokasi Agunan
'V' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, // Nilai Agunan
'W' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, // Nilai Agunan Menurut LJK
'X' => NumberFormat::FORMAT_DATE_DDMMYYYY, // Tanggal Penilaian LJK
'Y' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, // Nilai Agunan Penilai Independen
'Z' => NumberFormat::FORMAT_TEXT, // Nama Penilai Independen
'AA' => NumberFormat::FORMAT_DATE_DDMMYYYY, // Tanggal Penilaian Penilai Independen
'AB' => NumberFormat::FORMAT_NUMBER, // Jumlah Hari Tunggakan
'AC' => NumberFormat::FORMAT_TEXT, // Status Paripasu
'AD' => NumberFormat::FORMAT_PERCENTAGE_00, // Prosentase Paripasu
'AE' => NumberFormat::FORMAT_TEXT, // Status Kredit Join
'AF' => NumberFormat::FORMAT_TEXT, // Diasuransikan
'AG' => NumberFormat::FORMAT_TEXT, // Keterangan
'AH' => NumberFormat::FORMAT_TEXT, // Kantor Cabang
'AI' => NumberFormat::FORMAT_TEXT, // Operasi Data
'AJ' => NumberFormat::FORMAT_TEXT, // Kode Cabang
'AK' => NumberFormat::FORMAT_TEXT, // Nama Debitur
'AL' => NumberFormat::FORMAT_TEXT, // Nama Cabang
'AM' => NumberFormat::FORMAT_TEXT, // Flag
'AN' => NumberFormat::FORMAT_DATE_DATETIME, // Created At
];
}
}

View File

@@ -149,91 +149,87 @@ class PembayaranController extends Controller
{ {
$req = request()->all(); $req = request()->all();
if($req['type'] == 'create'){ if(isset($req['type'])){
$data = [ if($req['type'] == 'create'){
'nomor_tiket' => $req['nomor_tiket'] ?? '', $data = [
'nominal_bayar' => $req['nominal_bayar'] ?? '', 'nomor_tiket' => $req['nomor_tiket'] ?? '',
'catatan' => $req['catatan'] ?? '' 'nominal_bayar' => $req['nominal_bayar'] ?? '',
]; 'catatan' => $req['catatan'] ?? ''
];
if(request()->hasFile('bukti_bayar')){ if(request()->hasFile('bukti_bayar')){
$folderPath = 'persetujuan_penawaran/bukti_bayar/' . $req['nomor_tiket']; $folderPath = 'persetujuan_penawaran/bukti_bayar/' . $req['nomor_tiket'];
$data['bukti_bayar'] = $request->file('bukti_bayar')->store($folderPath, 'public'); $data['bukti_bayar'] = $request->file('bukti_bayar')->store($folderPath, 'public');
}
$persetujuanPenawaran = PersetujuanPenawaran::create($data);
$noc = [
'persetujuan_penawaran_id' => $persetujuanPenawaran->id,
'nomor_tiket' => $req['nomor_tiket'] ?? '',
'debiture_id' => $req['debitur_id'] ?? '',
'branch_id' => Auth::user()->branch_id,
];
$noc = Noc::create($noc);
$bucok = [
'tanggal_penuh' => $persetujuanPenawaran->created_at,
'tanggal' => $persetujuanPenawaran->created_at->format('d'),
'bulan' => $persetujuanPenawaran->created_at->format('m'),
'tahun' => $persetujuanPenawaran->created_at->format('Y'),
'nomor_tiket' => $req['nomor_tiket'] ?? '',
'nominal' => $req['nominal_bayar'] ?? '',
'nominal_berjalan' => $req['nominal_bayar'] ?? '',
'penyelesaian' => 'Belum Selesai',
'nama_sub_direktorat' => $noc->branch?->name ?? '',
'nama_direktorat_cabang' => $noc->branch?->name ?? '',
];
Bucok::updateOrCreate([
'nomor_tiket' => $req['nomor_tiket'] ?? '',
], $bucok);
return redirect()
->route('pembayaran.index')->with('success', 'Pembayaran berhasil disimpan.');
} }
$persetujuanPenawaran = PersetujuanPenawaran::create($data); if($req['type'] == 'kurang_bayar'){
$noc = [ $noc = Noc::find($req['noc_id']);
'persetujuan_penawaran_id' => $persetujuanPenawaran->id, $noc->nominal_pelunasan = $req['nominal_pelunasan'];
'nomor_tiket' => $req['nomor_tiket'] ?? '', if (request()->hasFile('bukti_ksl_kurang_bayar')) {
'debiture_id' => $req['debitur_id'] ?? '', $folderPath = 'persetujuan_penawaran/bukti_ksl_kurang_bayar/' . $req['noc_id'];
'branch_id' => Auth::user()->branch_id, $noc->bukti_ksl_kurang_bayar = $request->file('bukti_ksl_kurang_bayar')->store($folderPath, 'public');
]; }
$noc = Noc::create($noc); $noc->save();
$bucok = [ $persetujuanPenawaran = PersetujuanPenawaran::find($noc->persetujuan_penawaran_id);
'tanggal_penuh' => $persetujuanPenawaran->created_at, $persetujuanPenawaran->bukti_ksl_kurang_bayar = $noc->bukti_ksl_kurang_bayar;
'tanggal' => $persetujuanPenawaran->created_at->format('d'), $persetujuanPenawaran->nominal_kurang_bayar = $req['nominal_pelunasan'];
'bulan' => $persetujuanPenawaran->created_at->format('m'), $persetujuanPenawaran->save();
'tahun' => $persetujuanPenawaran->created_at->format('Y'), return redirect()
'nomor_tiket' => $req['nomor_tiket'] ?? '', ->route('pembayaran.kurang.index')->with('success', 'Pelunasan Kurang Bayar berhasil disimpan.');
'nominal' => $req['nominal_bayar'] ?? '',
'nominal_berjalan' => $req['nominal_bayar'] ?? '',
'penyelesaian' => 'Belum Selesai',
'nama_sub_direktorat' => $noc->branch?->name ?? '',
'nama_direktorat_cabang' => $noc->branch?->name ?? '',
];
Bucok::updateOrCreate([
'nomor_tiket' => $req['nomor_tiket'] ?? '',
], $bucok);
return redirect()
->route('pembayaran.index')->with('success', 'Pembayaran berhasil disimpan.');
}
if($req['type'] == 'kurang_bayar'){
$noc = Noc::find($req['noc_id']);
$noc->nominal_pelunasan = $req['nominal_pelunasan'];
if (request()->hasFile('bukti_ksl_kurang_bayar')) {
$folderPath = 'persetujuan_penawaran/bukti_ksl_kurang_bayar/' . $req['noc_id'];
$noc->bukti_ksl_kurang_bayar = $request->file('bukti_ksl_kurang_bayar')->store($folderPath, 'public');
} }
$noc->save();
$persetujuanPenawaran = PersetujuanPenawaran::find($noc->persetujuan_penawaran_id); if($req['type'] == 'lebih_bayar'){
$persetujuanPenawaran->bukti_ksl_kurang_bayar = $noc->bukti_ksl_kurang_bayar; $noc = Noc::find($req['noc_id']);
$persetujuanPenawaran->nominal_kurang_bayar = $req['nominal_pelunasan']; if (request()->hasFile('bukti_ksl_lebih_bayar')) {
$persetujuanPenawaran->save(); $folderPath = 'persetujuan_penawaran/bukti_ksl_lebih_bayar/' . $req['noc_id'];
return redirect() $noc->bukti_ksl_lebih_bayar = $request->file('bukti_ksl_lebih_bayar')->store($folderPath, 'public');
->route('pembayaran.kurang.index')->with('success', 'Pelunasan Kurang Bayar berhasil disimpan.'); }
} $noc->save();
if($req['type'] == 'lebih_bayar'){ return redirect()
$noc = Noc::find($req['noc_id']); ->route('pembayaran.lebih.index')->with('success', 'Pengembalian Lebih Bayar berhasil disimpan.');
if (request()->hasFile('bukti_ksl_lebih_bayar')) {
$folderPath = 'persetujuan_penawaran/bukti_ksl_lebih_bayar/' . $req['noc_id'];
$noc->bukti_ksl_lebih_bayar = $request->file('bukti_ksl_lebih_bayar')->store($folderPath, 'public');
} }
$noc->save();
return redirect()
->route('pembayaran.lebih.index')->with('success', 'Pengembalian Lebih Bayar berhasil disimpan.');
} }
$validated = $request->validated(); $validated = $request->validated();
$validated['nominal_bayar'] = $req['nominal_bayar'] ?? 0;
$validated['created_by'] = Auth::id(); $validated['created_by'] = Auth::id();
$validated['status'] = '0'; $validated['status'] = '0';
$persetujuanPenawaran = PersetujuanPenawaran::where('permohonan_id', $validated['permohonan_id'] ?? null)->first(); $persetujuanPenawaran = PersetujuanPenawaran::where('permohonan_id', $validated['permohonan_id'] ?? null)->first();
$permohonan = Permohonan::find(request()->get('permohonan_id')); $permohonan = Permohonan::find(request()->get('permohonan_id'));
if ($persetujuanPenawaran) { if ($persetujuanPenawaran) {
// if (isset($validated['penawaran_id'])) {
// $persetujuanPenawaran = PersetujuanPenawaran::create(
// ['penawaran_id' => $validated['penawaran_id']],
// $validated,
// );
$persetujuanPenawaran->fill($validated); $persetujuanPenawaran->fill($validated);
if ($request->hasFile('bukti_bayar')) { if ($request->hasFile('bukti_bayar')) {
@@ -269,6 +265,33 @@ class PembayaranController extends Controller
$persetujuanPenawaran->save(); $persetujuanPenawaran->save();
} }
$bucok = [
'tanggal_penuh' => $persetujuanPenawaran->created_at,
'tanggal' => $persetujuanPenawaran->created_at->format('d'),
'bulan' => $persetujuanPenawaran->created_at->format('m'),
'tahun' => $persetujuanPenawaran->created_at->format('Y'),
'nomor_tiket' => $req['nomor_tiket'] ?? '',
'nominal' => $req['nominal_bayar'] ?? '',
'nominal_berjalan' => $req['nominal_bayar'] ?? '',
'penyelesaian' => 'Belum Selesai',
'nama_sub_direktorat' => $noc->branch?->name ?? '',
'nama_direktorat_cabang' => $noc->branch?->name ?? '',
'permohonan_id' => $permohonan->id,
'nomor_registrasi' => $permohonan->nomor_registrasi,
];
if(isset($req['nomor_tiket']) && $req['nomor_tiket'] !=''){
Bucok::updateOrCreate([
'nomor_registrasi' => $permohonan->nomor_registrasi,
'nomor_tiket' => $req['nomor_tiket'],
], $bucok);
} else {
Bucok::updateOrCreate([
'nomor_registrasi' => $permohonan->nomor_registrasi
], $bucok);
}
// Update the status of the related permohonan to 'spk' // Update the status of the related permohonan to 'spk'
if ($permohonan) { if ($permohonan) {

View File

@@ -23,6 +23,7 @@
use Modules\Lpj\Models\Penilaian; use Modules\Lpj\Models\Penilaian;
use Modules\Lpj\Models\Permohonan; use Modules\Lpj\Models\Permohonan;
use Modules\Lpj\Models\PermohonanPembatalan; use Modules\Lpj\Models\PermohonanPembatalan;
use Modules\Lpj\Models\PersetujuanPenawaran;
use Modules\Lpj\Models\StatusPermohonan; use Modules\Lpj\Models\StatusPermohonan;
use Modules\Lpj\Models\TujuanPenilaian; use Modules\Lpj\Models\TujuanPenilaian;
use Modules\Lpj\Services\PermohonanHistoryService; use Modules\Lpj\Services\PermohonanHistoryService;
@@ -358,6 +359,16 @@
$permohonan->status = $request->status; $permohonan->status = $request->status;
$permohonan->keterangan = $request->keterangan; $permohonan->keterangan = $request->keterangan;
$permohonan->save(); $permohonan->save();
if($permohonan->jenis_penilaian_id==1){
$persetujuanPenawaran = PersetujuanPenawaran::where('permohonan_id', $id)->first();
if(!$persetujuanPenawaran){
$persetujuanPenawaran = PersetujuanPenawaran::create([
'permohonan_id' => $id,
'created_by' => auth()->id(),
]);
}
}
} catch (Exception $e) { } catch (Exception $e) {
return redirect()->route('authorization.show', $id)->with('error', 'Failed to update permohonan'); return redirect()->route('authorization.show', $id)->with('error', 'Failed to update permohonan');
} }

View File

@@ -7,6 +7,7 @@ use Exception;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Validation\ValidationException; use Illuminate\Validation\ValidationException;
use Maatwebsite\Excel\Facades\Excel; use Maatwebsite\Excel\Facades\Excel;
use Modules\Lpj\Exports\SlikExport;
use Modules\Lpj\Imports\SlikImport; use Modules\Lpj\Imports\SlikImport;
use Modules\Lpj\Models\Slik; use Modules\Lpj\Models\Slik;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
@@ -439,35 +440,109 @@ class SlikController extends Controller
} }
/** /**
* Hapus semua data slik * Export data SLIK ke Excel
* *
* @return \Illuminate\Http\RedirectResponse * Method ini menangani export data SLIK ke format Excel dengan:
* - Logging aktivitas export
* - Error handling yang proper
* - Format Excel yang sesuai dengan struktur SLIK
*
* @return \Symfony\Component\HttpFoundation\BinaryFileResponse
*/
public function export()
{
try {
Log::info('SLIK Export: Memulai proses export data SLIK', [
'user_id' => Auth::id(),
'timestamp' => now(),
'memory_usage' => memory_get_usage(true) / 1024 / 1024 . ' MB'
]);
// Hitung total data yang akan di-export
$totalData = Slik::count();
Log::info('SLIK Export: Informasi data export', [
'total_records' => $totalData,
'user_id' => Auth::id(),
'timestamp' => now()
]);
// Generate nama file dengan timestamp
$filename = 'slik_export_' . date('Y-m-d_H-i-s') . '.xlsx';
// Proses export menggunakan SlikExport class
$export = Excel::download(new SlikExport(), $filename);
Log::info('SLIK Export: Berhasil generate file export', [
'filename' => $filename,
'total_records' => $totalData,
'user_id' => Auth::id(),
'timestamp' => now(),
'memory_peak' => memory_get_peak_usage(true) / 1024 / 1024 . ' MB'
]);
return $export;
} catch (\Exception $e) {
Log::error('SLIK Export: Gagal melakukan export data SLIK', [
'error' => $e->getMessage(),
'trace' => $e->getTraceAsString(),
'user_id' => Auth::id(),
'timestamp' => now(),
'memory_usage' => memory_get_usage(true) / 1024 / 1024 . ' MB'
]);
return response()->json([
'success' => false,
'message' => 'Gagal melakukan export data SLIK: ' . $e->getMessage()
], 500);
}
}
/**
* Truncate all SLIK data
*
* @return \Illuminate\Http\JsonResponse
*/ */
public function truncate() public function truncate()
{ {
DB::beginTransaction();
try { try {
Log::info('SlikController: Menghapus semua data Slik', [ DB::beginTransaction();
'user_id' => Auth::id()
Log::info('SLIK Truncate: Memulai proses truncate data SLIK', [
'user_id' => Auth::id(),
'timestamp' => now()
]); ]);
// Truncate tabel SLIK
Slik::truncate(); Slik::truncate();
DB::commit(); DB::commit();
Log::info('SlikController: Semua data Slik berhasil dihapus', [
'user_id' => Auth::id() Log::info('SLIK Truncate: Berhasil menghapus semua data SLIK', [
'user_id' => Auth::id(),
'timestamp' => now()
]); ]);
return redirect()->back()->with('success', 'Semua data Slik berhasil dihapus.'); return response()->json([
'success' => true,
} catch (Exception $e) { 'message' => 'Semua data SLIK berhasil dihapus'
]);
} catch (\Exception $e) {
DB::rollback(); DB::rollback();
Log::error('SlikController: Gagal menghapus data Slik', [
Log::error('SLIK Truncate: Gagal menghapus data SLIK', [
'error' => $e->getMessage(), 'error' => $e->getMessage(),
'user_id' => Auth::id() 'trace' => $e->getTraceAsString(),
'user_id' => Auth::id(),
'timestamp' => now()
]); ]);
return redirect()->back()->with('error', 'Gagal menghapus data Slik: ' . $e->getMessage()); return response()->json([
'success' => false,
'message' => 'Gagal menghapus data SLIK: ' . $e->getMessage()
], 500);
} }
} }
} }

View File

@@ -80,6 +80,8 @@ class Bucok extends Base
'keterangan_gantung', 'keterangan_gantung',
'lainnya_satu', 'lainnya_satu',
'lainnya_dua', 'lainnya_dua',
'nomor_registrasi',
'permohonan_id',
]; ];
/** /**

View File

@@ -0,0 +1,52 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* Menambahkan kolom nomor_registrasi dan permohonan_id pada table bucoks
* untuk menghubungkan data bucok dengan permohonan penilaian
*/
public function up(): void
{
Schema::table('bucoks', function (Blueprint $table) {
// Menambahkan kolom nomor_registrasi untuk tracking nomor registrasi
$table->string('nomor_registrasi')->nullable()->after('nomor_tiket')->comment('Nomor registrasi terkait');
// Menambahkan kolom permohonan_id sebagai foreign key ke table permohonan
$table->unsignedBigInteger('permohonan_id')->nullable()->after('nomor_registrasi')->comment('ID permohonan terkait');
// Menambahkan foreign key constraint ke table permohonan
$table->foreign('permohonan_id')->references('id')->on('permohonan')->onDelete('set null');
// Menambahkan index untuk performa query
$table->index(['nomor_registrasi']);
$table->index(['permohonan_id']);
});
}
/**
* Reverse the migrations.
*
* Menghapus kolom nomor_registrasi dan permohonan_id dari table bucoks
*/
public function down(): void
{
Schema::table('bucoks', function (Blueprint $table) {
// Menghapus foreign key constraint terlebih dahulu
$table->dropForeign(['permohonan_id']);
// Menghapus index
$table->dropIndex(['nomor_registrasi']);
$table->dropIndex(['permohonan_id']);
// Menghapus kolom
$table->dropColumn(['nomor_registrasi', 'permohonan_id']);
});
}
};

View File

@@ -57,8 +57,6 @@
"permission": "", "permission": "",
"roles": [ "roles": [
"administrator", "administrator",
"pemohon-ao",
"pemohon-eo",
"admin", "admin",
"DD Appraisal", "DD Appraisal",
"EO Appraisal", "EO Appraisal",
@@ -74,8 +72,6 @@
"permission": "", "permission": "",
"roles": [ "roles": [
"administrator", "administrator",
"pemohon-ao",
"pemohon-eo",
"admin", "admin",
"DD Appraisal", "DD Appraisal",
"EO Appraisal", "EO Appraisal",
@@ -91,8 +87,6 @@
"permission": "", "permission": "",
"roles": [ "roles": [
"administrator", "administrator",
"pemohon-ao",
"pemohon-eo",
"admin", "admin",
"DD Appraisal", "DD Appraisal",
"EO Appraisal", "EO Appraisal",
@@ -118,9 +112,7 @@
"attributes": [], "attributes": [],
"permission": "", "permission": "",
"roles": [ "roles": [
"administrator", "administrator",
"pemohon-ao",
"pemohon-eo",
"admin", "admin",
"DD Appraisal", "DD Appraisal",
"EO Appraisal", "EO Appraisal",
@@ -136,8 +128,6 @@
"permission": "", "permission": "",
"roles": [ "roles": [
"administrator", "administrator",
"pemohon-ao",
"pemohon-eo",
"admin", "admin",
"DD Appraisal", "DD Appraisal",
"EO Appraisal", "EO Appraisal",
@@ -153,8 +143,6 @@
"permission": "", "permission": "",
"roles": [ "roles": [
"administrator", "administrator",
"pemohon-ao",
"pemohon-eo",
"admin", "admin",
"DD Appraisal", "DD Appraisal",
"EO Appraisal", "EO Appraisal",
@@ -207,8 +195,6 @@
"permission": "", "permission": "",
"roles": [ "roles": [
"administrator", "administrator",
"pemohon-ao",
"pemohon-eo",
"admin", "admin",
"DD Appraisal", "DD Appraisal",
"EO Appraisal", "EO Appraisal",
@@ -333,8 +319,7 @@
"permission": "", "permission": "",
"roles": [ "roles": [
"administrator", "administrator",
"pemohon-ao", "pemohon-ao"
"pemohon-eo"
] ]
}, },
{ {
@@ -346,7 +331,7 @@
"permission": "", "permission": "",
"roles": [ "roles": [
"administrator", "administrator",
"pemohon-eo" "pemohon-ao"
] ]
}, },
{ {
@@ -384,6 +369,23 @@
"pemohon-ao" "pemohon-ao"
] ]
}, },
{
"title": "Memo Penyelesaian",
"path": "memo",
"icon": "ki-filled ki-document text-lg text-primary",
"classes": "",
"attributes": [],
"permission": "",
"roles": [
"administrator",
"pemohon-ao",
"pemohon-eo",
"admin",
"DD Appraisal",
"EO Appraisal",
"senior-officer"
]
},
{ {
"title": "Kurang Bayar", "title": "Kurang Bayar",
"path": "pembayaran.kurang", "path": "pembayaran.kurang",
@@ -606,8 +608,7 @@
"permission": "", "permission": "",
"roles": [ "roles": [
"administrator", "administrator",
"pemohon-ao", "pemohon-ao"
"pemohon-eo"
] ]
}, },
{ {
@@ -655,8 +656,6 @@
"permission": "", "permission": "",
"roles": [ "roles": [
"administrator", "administrator",
"pemohon-ao",
"pemohon-eo",
"admin", "admin",
"surveyor", "surveyor",
"senior-officer", "senior-officer",
@@ -709,23 +708,6 @@
"EO Appraisal", "EO Appraisal",
"senior-officer" "senior-officer"
] ]
},
{
"title": "Memo Penyelesaian",
"path": "memo",
"icon": "ki-filled ki-document text-lg text-primary",
"classes": "",
"attributes": [],
"permission": "",
"roles": [
"administrator",
"pemohon-ao",
"pemohon-eo",
"admin",
"DD Appraisal",
"EO Appraisal",
"senior-officer"
]
} }
], ],
"master": [ "master": [

View File

@@ -1,120 +1,131 @@
<form action="{{ isset($debitur->id) ? route('debitur.update', $debitur->id) : route('debitur.store') }}" method="POST" id="debitur-form" class="grid gap-5"> <form action="{{ isset($debitur->id) ? route('debitur.update', $debitur->id) : route('debitur.store') }}" method="POST"
@if(isset($debitur->id)) id="debitur-form" class="grid gap-5">
@if (isset($debitur->id))
<input type="hidden" name="id" value="{{ $debitur->id }}"> <input type="hidden" name="id" value="{{ $debitur->id }}">
@method('PUT') @method('PUT')
@endif @endif
@csrf @csrf
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex flex-wrap gap-2.5 items-baseline lg:flex-nowrap">
<label class="form-label max-w-56 gap-1"> <label class="gap-1 form-label max-w-56">
Cabang Cabang
<span class="text-danger">*</span> <span class="text-danger">*</span>
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
@if(auth()->user()->hasRole('administrator')) @if (auth()->user()->hasRole(['administrator']))
<select class="input tomselect w-full @error('branch_id') border-danger bg-danger-light @enderror" name="branch_id" id="branch_id"> <select class="input tomselect w-full @error('branch_id') border-danger bg-danger-light @enderror"
name="branch_id" id="branch_id">
<option value="">Pilih Cabang</option> <option value="">Pilih Cabang</option>
@foreach($branches as $branch) @foreach ($branches as $branch)
<option value="{{ $branch->id }}" {{ (isset($debitur) && $branch->id == $debitur->branch_id) || (old('branch_id') == $branch->id) ? 'selected' : '' }}> <option value="{{ $branch->id }}"
{{ (isset($debitur) && $branch->id == $debitur->branch_id) || old('branch_id') == $branch->id ? 'selected' : '' }}>
{{ $branch->name }} {{ $branch->name }}
</option> </option>
@endforeach @endforeach
</select> </select>
@else @else
<input type="hidden" name="branch_id" value="{{ auth()->user()->branch_id }}"> <input type="hidden" name="branch_id" value="{{ auth()->user()->branch_id }}">
<input type="text" class="input w-full" value="{{ auth()->user()->branch->name }}" readonly> <input type="text" class="w-full input" value="{{ auth()->user()->branch->name }}" readonly>
@endif @endif
@error('branch_id') @error('branch_id')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="text-sm alert text-danger">{{ $message }}</em>
@enderror @enderror
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex flex-wrap gap-2.5 items-baseline lg:flex-nowrap">
<label class="form-label max-w-56 gap-1"> <label class="gap-1 form-label max-w-56">
CIF CIF
<span class="text-danger"> <span class="text-danger">
* *
</span> </span>
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input class="input @error('cif') border-danger bg-danger-light @enderror" type="number" id="cif" name="cif" value="{{ $debitur->cif ?? '0000000000' }}"> <input class="input @error('cif') border-danger bg-danger-light @enderror" type="number" id="cif"
name="cif" value="{{ $debitur->cif ?? '0000000000' }}">
@error('cif') @error('cif')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="text-sm alert text-danger">{{ $message }}</em>
@enderror @enderror
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex flex-wrap gap-2.5 items-baseline lg:flex-nowrap">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
Nomor Rekening Nomor Rekening
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input class="input @error('nomor_rekening') border-danger bg-danger-light @enderror" type="number" name="nomor_rekening" value="{{ $debitur->nomor_rekening ?? '' }}"> <input class="input @error('nomor_rekening') border-danger bg-danger-light @enderror" type="number"
name="nomor_rekening" value="{{ $debitur->nomor_rekening ?? '' }}">
@error('nomor_rekening') @error('nomor_rekening')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="text-sm alert text-danger">{{ $message }}</em>
@enderror @enderror
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex flex-wrap gap-2.5 items-baseline lg:flex-nowrap">
<label class="form-label max-w-56 gap-1"> <label class="gap-1 form-label max-w-56">
Nama Debitur Nama Debitur
<span class="text-danger"> <span class="text-danger">
* *
</span> </span>
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input required class="input @error('name') border-danger bg-danger-light @enderror" type="text" name="name" value="{{ $debitur->name ?? '' }}"> <input required class="input @error('name') border-danger bg-danger-light @enderror" type="text"
name="name" value="{{ $debitur->name ?? '' }}">
@error('name') @error('name')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="text-sm alert text-danger">{{ $message }}</em>
@enderror @enderror
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex flex-wrap gap-2.5 items-baseline lg:flex-nowrap">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
NPWP NPWP
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input class="input @error('npwp') border-danger bg-danger-light @enderror" type="number" name="npwp" value="{{ $debitur->npwp ?? '' }}"> <input class="input @error('npwp') border-danger bg-danger-light @enderror" type="number" name="npwp"
value="{{ $debitur->npwp ?? '' }}">
@error('npwp') @error('npwp')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="text-sm alert text-danger">{{ $message }}</em>
@enderror @enderror
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex flex-wrap gap-2.5 items-baseline lg:flex-nowrap">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
Email Email
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input class="input @error('email') border-danger bg-danger-light @enderror" type="email" name="email" value="{{ $debitur->email ?? '' }}"> <input class="input @error('email') border-danger bg-danger-light @enderror" type="email" name="email"
value="{{ $debitur->email ?? '' }}">
@error('email') @error('email')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="text-sm alert text-danger">{{ $message }}</em>
@enderror @enderror
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex flex-wrap gap-2.5 items-baseline lg:flex-nowrap">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
No Handphone No Handphone
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input class="input @error('phone') border-danger bg-danger-light @enderror" type="number" name="phone" value="{{ $debitur->phone ?? '' }}"> <input class="input @error('phone') border-danger bg-danger-light @enderror" type="number" name="phone"
value="{{ $debitur->phone ?? '' }}">
@error('phone') @error('phone')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="text-sm alert text-danger">{{ $message }}</em>
@enderror @enderror
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex flex-wrap gap-2.5 items-baseline lg:flex-nowrap">
<label class="form-label max-w-56 gap-1"> <label class="gap-1 form-label max-w-56">
Alamat Alamat
<span class="text-danger"> <span class="text-danger">
* *
</span> </span>
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<div class="flex flex-col lg:flex-row gap-2 w-full"> <div class="flex flex-col gap-2 w-full lg:flex-row">
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<select required id="province_code" name="province_code" class="select w-full @error('province_code') border-danger bg-danger-light @enderror"> <select required id="province_code" name="province_code"
class="select w-full @error('province_code') border-danger bg-danger-light @enderror">
<option value="">Select Province</option> <option value="">Select Province</option>
@foreach($provinces as $province) @foreach ($provinces as $province)
@if(isset($debitur)) @if (isset($debitur))
<option value="{{ $province->code }}" {{ isset($debitur->province_code) && $debitur->province_code == $province->code?'selected' : '' }}> <option value="{{ $province->code }}"
{{ isset($debitur->province_code) && $debitur->province_code == $province->code ? 'selected' : '' }}>
{{ $province->name }} {{ $province->name }}
</option> </option>
@else @else
@@ -125,16 +136,18 @@
@endforeach @endforeach
</select> </select>
@error('province_code') @error('province_code')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="text-sm alert text-danger">{{ $message }}</em>
@enderror @enderror
</div> </div>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<select required id="city_code" name="city_code" class="select w-full @error('city_code') border-danger bg-danger-light @enderror"> <select required id="city_code" name="city_code"
class="select w-full @error('city_code') border-danger bg-danger-light @enderror">
<option value="">Select City</option> <option value="">Select City</option>
@if(isset($cities)) @if (isset($cities))
@foreach($cities as $city) @foreach ($cities as $city)
@if(isset($debitur)) @if (isset($debitur))
<option value="{{ $city->code }}" {{ isset($debitur->city_code) && $debitur->city_code == $city->code?'selected' : '' }}> <option value="{{ $city->code }}"
{{ isset($debitur->city_code) && $debitur->city_code == $city->code ? 'selected' : '' }}>
{{ $city->name }} {{ $city->name }}
</option> </option>
@else @else
@@ -147,18 +160,20 @@
@endif @endif
</select> </select>
@error('city_code') @error('city_code')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="text-sm alert text-danger">{{ $message }}</em>
@enderror @enderror
</div> </div>
</div> </div>
<div class="flex flex-col lg:flex-row gap-2 w-full mt-2 lg:mt-5"> <div class="flex flex-col gap-2 mt-2 w-full lg:flex-row lg:mt-5">
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<select required id="district_code" name="district_code" class="select w-full @error('district_code') border-danger bg-danger-light @enderror"> <select required id="district_code" name="district_code"
class="select w-full @error('district_code') border-danger bg-danger-light @enderror">
<option value="">Select District</option> <option value="">Select District</option>
@if(isset($districts)) @if (isset($districts))
@foreach($districts as $district) @foreach ($districts as $district)
@if(isset($debitur)) @if (isset($debitur))
<option value="{{ $district->code }}" {{ isset($debitur->district_code) && $debitur->district_code == $district->code?'selected' : '' }}> <option value="{{ $district->code }}"
{{ isset($debitur->district_code) && $debitur->district_code == $district->code ? 'selected' : '' }}>
{{ $district->name }} {{ $district->name }}
</option> </option>
@else @else
@@ -171,16 +186,18 @@
@endif @endif
</select> </select>
@error('district_code') @error('district_code')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="text-sm alert text-danger">{{ $message }}</em>
@enderror @enderror
</div> </div>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<select required id="village_code" name="village_code" class="select w-full @error('district_code') border-danger bg-danger-light @enderror"> <select required id="village_code" name="village_code"
class="select w-full @error('district_code') border-danger bg-danger-light @enderror">
<option value="">Select Village</option> <option value="">Select Village</option>
@if(isset($villages)) @if (isset($villages))
@foreach($villages as $village) @foreach ($villages as $village)
@if(isset($debitur)) @if (isset($debitur))
<option value="{{ $village->code }}" {{ isset($debitur->village_code) && $debitur->village_code == $village->code?'selected' : '' }}> <option value="{{ $village->code }}"
{{ isset($debitur->village_code) && $debitur->village_code == $village->code ? 'selected' : '' }}>
{{ $village->name }} {{ $village->name }}
</option> </option>
@else @else
@@ -193,20 +210,23 @@
@endif @endif
</select> </select>
@error('district_code') @error('district_code')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="text-sm alert text-danger">{{ $message }}</em>
@enderror @enderror
</div> </div>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input required class="input @error('postal_code') border-danger bg-danger-light @enderror" type="number" id="postal_code" name="postal_code" value="{{ $debitur->postal_code ?? '' }}" placeholder="Postal Code"> <input required class="input @error('postal_code') border-danger bg-danger-light @enderror"
type="number" id="postal_code" name="postal_code"
value="{{ $debitur->postal_code ?? '' }}" placeholder="Postal Code">
@error('postal_code') @error('postal_code')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="text-sm alert text-danger">{{ $message }}</em>
@enderror @enderror
</div> </div>
</div> </div>
<div class="flex flex-row w-full mt-2 lg:mt-5"> <div class="flex flex-row mt-2 w-full lg:mt-5">
<textarea required class="textarea @error('address') border-danger bg-danger-light @enderror" rows="3" id="address" name="address" placeholder="Alamat Lengkap">{{ $debitur->address ?? '' }}</textarea> <textarea required class="textarea @error('address') border-danger bg-danger-light @enderror" rows="3"
id="address" name="address" placeholder="Alamat Lengkap">{{ $debitur->address ?? '' }}</textarea>
@error('address') @error('address')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="text-sm alert text-danger">{{ $message }}</em>
@enderror @enderror
</div> </div>
</div> </div>
@@ -219,7 +239,7 @@
</form> </form>
@push('scripts') @push('scripts')
<script> <script>
document.addEventListener('DOMContentLoaded', function () { document.addEventListener('DOMContentLoaded', function() {
const form = document.getElementById('debitur-form'); const form = document.getElementById('debitur-form');
const nameInput = form.querySelector('input[name="name"]'); const nameInput = form.querySelector('input[name="name"]');
const provinceSelect = form.querySelector('#province_code'); const provinceSelect = form.querySelector('#province_code');
@@ -319,7 +339,7 @@
return isValid; return isValid;
} }
form.addEventListener('submit', function (event) { form.addEventListener('submit', function(event) {
const isValid = const isValid =
validateBranch() && validateBranch() &&
validateCIF() && validateCIF() &&
@@ -336,7 +356,7 @@
} }
}); });
submitButton.addEventListener('click', function (event) { submitButton.addEventListener('click', function(event) {
if (!validateAllFields()) { if (!validateAllFields()) {
event.preventDefault(); event.preventDefault();
} }

View File

@@ -5,97 +5,119 @@
@endsection @endsection
@section('content') @section('content')
<div class="w-full grid gap-5 lg:gap-7.5 mx-auto"> <div class="grid gap-5 mx-auto w-full lg:gap-7.5">
<div class="card border border-agi-100 pb-2.5"> <div class="pb-2.5 border card border-agi-100">
<div class="card-header bg-agi-50" id="basic_settings"> <div class="card-header bg-agi-50" id="basic_settings">
<div class="card-title flex flex-row gap-1.5"> <div class="flex flex-row gap-1.5 card-title">
Persetujuan Penawaran Persetujuan Penawaranaa
</div> </div>
<div class="flex items-center gap-2"> <div class="flex gap-2 items-center">
<a href="{{ route('persetujuan-penawaran.index') }}" class="btn btn-xs btn-info"><i class="ki-filled ki-exit-left"></i> Back</a> <a href="{{ route('persetujuan-penawaran.index') }}" class="btn btn-xs btn-info"><i
class="ki-filled ki-exit-left"></i> Back</a>
</div> </div>
</div> </div>
<div class="card-body"> <div class="card-body">
<form action="{{ route('persetujuan-penawaran.store') }}" method="POST" class="grid gap-5" enctype="multipart/form-data"> <form action="{{ route('persetujuan-penawaran.store') }}" method="POST" class="grid gap-5"
enctype="multipart/form-data">
@csrf @csrf
<input type="hidden" name="permohonan_id" value="{{ $permohonan->id }}"> <input type="hidden" name="permohonan_id" value="{{ $permohonan->id }}">
<input type="hidden" name="penawaran_id" value="{{ $permohonan->penawaran->id ?? old('penawaran_id') }}"> <input type="hidden" name="penawaran_id"
<input type="hidden" name="nomor_proposal_penawaran" value="{{ $permohonan->penawaran->detail->no_proposal ?? old('nomor_proposal_penawaran') }}"> value="{{ $permohonan->penawaran->id ?? old('penawaran_id') }}">
<input type="hidden" name="tanggal_proposal_penawaran" value="{{ $permohonan->penawaran->detail->tgl_proposal ?? old('tanggal_proposal_penawaran') }}"> <input type="hidden" name="nomor_proposal_penawaran"
<input type="hidden" name="biaya_final" value="{{ $permohonan->penawaran->detail->biaya_penawaran ?? old('biaya_final') }}"> value="{{ $permohonan->penawaran->detail->no_proposal ?? old('nomor_proposal_penawaran') }}">
<input type="hidden" name="tanggal_proposal_penawaran"
value="{{ $permohonan->penawaran->detail->tgl_proposal ?? old('tanggal_proposal_penawaran') }}">
<input type="hidden" name="biaya_final"
value="{{ $permohonan->penawaran->detail->biaya_penawaran ?? old('biaya_final') }}">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 hidden"> <div class="flex hidden flex-wrap gap-2.5 items-baseline lg:flex-nowrap">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
Status Bayar Status Bayar
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<select class="input tomselect w-full @error('status_bayar') border-danger bg-danger-light @enderror" name="status_bayar" id="status_bayar"> <select
class="input tomselect w-full @error('status_bayar') border-danger bg-danger-light @enderror"
name="status_bayar" id="status_bayar">
<option value="">Pilih Status Bayar</option> <option value="">Pilih Status Bayar</option>
<option value="sudah_bayar" {{ (old('status_bayar') == 'sudah_bayar') || (isset($permohonan) && $permohonan->status_bayar == 'sudah_bayar') ? 'selected' : '' }}>Sudah Bayar</option> <option value="sudah_bayar"
<option value="belum_bayar" {{ (old('status_bayar') == 'belum_bayar') || (isset($permohonan) && $permohonan->status_bayar == 'belum_bayar') ? 'selected' : '' }}>Belum Bayar</option> {{ old('status_bayar') == 'sudah_bayar' || (isset($permohonan) && $permohonan->status_bayar == 'sudah_bayar') ? 'selected' : '' }}>
Sudah Bayar</option>
<option value="belum_bayar"
{{ old('status_bayar') == 'belum_bayar' || (isset($permohonan) && $permohonan->status_bayar == 'belum_bayar') ? 'selected' : '' }}>
Belum Bayar</option>
</select> </select>
@error('status_bayar') @error('status_bayar')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="text-sm alert text-danger">{{ $message }}</em>
@enderror @enderror
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex flex-wrap gap-2.5 items-baseline lg:flex-nowrap">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
File Persetujuan Penawaran File Persetujuan Penawaran
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input type="file" name="file_persetujuan_penawaran" id="file_persetujuan_penawaran" class="file-input w-full @error('file_persetujuan_penawaran') border-danger bg-danger-light @enderror" accept=".pdf,.doc,.docx"> <input type="file" name="file_persetujuan_penawaran" id="file_persetujuan_penawaran"
class="file-input w-full @error('file_persetujuan_penawaran') border-danger bg-danger-light @enderror"
accept=".pdf,.doc,.docx">
@error('file_persetujuan_penawaran') @error('file_persetujuan_penawaran')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="text-sm alert text-danger">{{ $message }}</em>
@enderror @enderror
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex flex-wrap gap-2.5 items-baseline lg:flex-nowrap">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
Surat Representasi Surat Representasi
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input type="file" name="surat_representasi" id="surat_representasi" class="file-input w-full @error('surat_representasi') border-danger bg-danger-light @enderror" accept=".pdf,.doc,.docx"> <input type="file" name="surat_representasi" id="surat_representasi"
class="file-input w-full @error('surat_representasi') border-danger bg-danger-light @enderror"
accept=".pdf,.doc,.docx">
@error('surat_representasi') @error('surat_representasi')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="text-sm alert text-danger">{{ $message }}</em>
@enderror @enderror
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex flex-wrap gap-2.5 items-baseline lg:flex-nowrap">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
Nominal Bayar Nominal Bayar
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input type="number" name="nominal_bayar" id="nominal_bayar" class="input w-full @error('nominal_bayar') border-danger bg-danger-light @enderror" value="{{ old('nominal_bayar', $persetujuanPenawaran->nominal_bayar ?? '') }}" placeholder="Masukkan nominal bayar"> <input type="number" name="nominal_bayar" id="nominal_bayar"
class="input w-full @error('nominal_bayar') border-danger bg-danger-light @enderror"
value="{{ old('nominal_bayar', $persetujuanPenawaran->nominal_bayar ?? '') }}"
placeholder="Masukkan nominal bayar">
@error('nominal_bayar') @error('nominal_bayar')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="text-sm alert text-danger">{{ $message }}</em>
@enderror @enderror
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex flex-wrap gap-2.5 items-baseline lg:flex-nowrap">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
Bukti Bayar Bukti Bayar
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input type="file" name="bukti_bayar" id="bukti_bayar" class="file-input w-full @error('bukti_bayar') border-danger bg-danger-light @enderror" accept=".pdf,.jpg,.jpeg,.png"> <input type="file" name="bukti_bayar" id="bukti_bayar"
class="file-input w-full @error('bukti_bayar') border-danger bg-danger-light @enderror"
accept=".pdf,.jpg,.jpeg,.png">
@error('bukti_bayar') @error('bukti_bayar')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="text-sm alert text-danger">{{ $message }}</em>
@enderror @enderror
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex flex-wrap gap-2.5 items-baseline lg:flex-nowrap">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
Catatan Catatan
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<textarea name="catatan" id="catatan" rows="4" class="textarea w-full @error('catatan') border-danger bg-danger-light @enderror" placeholder="Masukkan catatan">{{ old('catatan', $persetujuanPenawaran->catatan ?? '') }}</textarea> <textarea name="catatan" id="catatan" rows="4"
class="textarea w-full @error('catatan') border-danger bg-danger-light @enderror" placeholder="Masukkan catatan">{{ old('catatan', $persetujuanPenawaran->catatan ?? '') }}</textarea>
@error('catatan') @error('catatan')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="text-sm alert text-danger">{{ $message }}</em>
@enderror @enderror
</div> </div>
</div> </div>