diff --git a/app/Http/Controllers/Api/DebiturController.php b/app/Http/Controllers/Api/DebiturController.php new file mode 100644 index 0000000..ee440bc --- /dev/null +++ b/app/Http/Controllers/Api/DebiturController.php @@ -0,0 +1,183 @@ + $request->get('q'), + 'user_id' => Auth::id() + ]); + + $query = $request->get('q', ''); + + // Validasi minimal 2 karakter untuk pencarian + if (strlen($query) < 2) { + return response()->json([ + 'success' => false, + 'message' => 'Minimal 2 karakter untuk pencarian', + 'data' => [] + ], 400); + } + + // Mulai database transaction + DB::beginTransaction(); + + try { + // Query pencarian debitur + // Asumsi tabel debitur dengan kolom: id, code, nama, alamat + $debiturs = Debiture::query() + ->select('id', 'cif', 'name', 'address') + ->whereAny(['cif','name'], 'LIKE', "%{$query}%") + ->orderBy('name', 'asc') + ->limit(20) // Batasi hasil maksimal 20 + ->get(); + + // Format data untuk TomSelect + $formattedData = $debiturs->map(function($debitur) { + return [ + 'id' => $debitur->id, + 'kode_debitur' => $debitur->cif, + 'name' => $debitur->name, + 'address' => $debitur->address + ]; + }); + + DB::commit(); + + // Log hasil pencarian + Log::info('API Debitur Search - Success', [ + 'query' => $query, + 'results_count' => $formattedData->count(), + 'user_id' => Auth::id() + ]); + + return response()->json([ + 'success' => true, + 'message' => 'Data debitur berhasil ditemukan', + 'data' => $formattedData + ]); + + } catch (Exception $e) { + DB::rollback(); + throw $e; + } + + } catch (Exception $e) { + // Log error + Log::error('API Debitur Search - Error', [ + 'query' => $request->get('q'), + 'error' => $e->getMessage(), + 'trace' => $e->getTraceAsString(), + 'user_id' => Auth::id() + ]); + + return response()->json([ + 'success' => false, + 'message' => 'Terjadi kesalahan saat mencari data debitur', + 'error' => config('app.debug') ? $e->getMessage() : 'Internal Server Error' + ], 500); + } + } + + /** + * Get detail debitur berdasarkan code + * + * @param Request $request + * @return JsonResponse + */ + public function getByCode(Request $request): JsonResponse + { + try { + $code = $request->get('code'); + + if (empty($code)) { + return response()->json([ + 'success' => false, + 'message' => 'Code debitur harus diisi', + 'data' => null + ], 400); + } + + // Log aktivitas get detail + Log::info('API Debitur GetByCode - Request', [ + 'code' => $code, + 'user_id' => Auth::id() + ]); + + DB::beginTransaction(); + + try { + $debitur = DB::table('debitur') + ->select('id', 'code', 'nama', 'alamat', 'telepon', 'email') + ->where('code', $code) + ->where('status', 'aktif') + ->first(); + + if (!$debitur) { + DB::rollback(); + return response()->json([ + 'success' => false, + 'message' => 'Debitur tidak ditemukan', + 'data' => null + ], 404); + } + + DB::commit(); + + Log::info('API Debitur GetByCode - Success', [ + 'code' => $code, + 'debitur_id' => $debitur->id, + 'user_id' => Auth::id() + ]); + + return response()->json([ + 'success' => true, + 'message' => 'Data debitur berhasil ditemukan', + 'data' => $debitur + ]); + + } catch (Exception $e) { + DB::rollback(); + throw $e; + } + + } catch (Exception $e) { + Log::error('API Debitur GetByCode - Error', [ + 'code' => $request->get('code'), + 'error' => $e->getMessage(), + 'trace' => $e->getTraceAsString(), + 'user_id' => Auth::id() + ]); + + return response()->json([ + 'success' => false, + 'message' => 'Terjadi kesalahan saat mengambil data debitur', + 'error' => config('app.debug') ? $e->getMessage() : 'Internal Server Error' + ], 500); + } + } +} diff --git a/app/Http/Controllers/NocController.php b/app/Http/Controllers/NocController.php index 6194a90..1ca1f4d 100644 --- a/app/Http/Controllers/NocController.php +++ b/app/Http/Controllers/NocController.php @@ -8,6 +8,7 @@ use Modules\Lpj\Http\Requests\NocRequest; use Modules\Lpj\Models\Noc; use Modules\Lpj\Models\PersetujuanPenawaran; + use Modules\Lpj\Models\JenisPenilaian; class NocController extends Controller { @@ -31,7 +32,8 @@ public function penyelesaian() { $persetujuanPenawarans = PersetujuanPenawaran::all(); - return view('lpj::noc.penyelesaian', compact('persetujuanPenawarans')); + $jenisPenilaians = JenisPenilaian::get(); + return view('lpj::noc.penyelesaian', compact('persetujuanPenawarans', 'jenisPenilaians')); } /** @@ -330,7 +332,8 @@ if ($request->has('search') && !empty($request->get('search'))) { $search = $request->get('search'); $query->where(function ($q) use ($search) { - $q->orWhereRelation('penawaran', 'nomor_registrasi', 'LIKE', '%' . $search . '%'); + $q->orWhereRelation('penawaran', 'nomor_registrasi', 'LIKE', '%' . $search . '%') + ->orWhereRelation('permohonan.jenisPenilaian', 'name', 'LIKE', '%' . $search . '%'); }); } @@ -376,6 +379,7 @@ 'nominal_diterima' => currencyFormat( $persetujuanPenawaran->noc->nominal_bayar ?? 0, ), + 'jenis_penilaian' => $persetujuanPenawaran->permohonan?->jenisPenilaian?->name ?? "", 'bukti_ksl' => $persetujuanPenawaran->noc->bukti_ksl ?? $persetujuanPenawaran->bukti_ksl ?? null, 'bukti_bayar' => $persetujuanPenawaran->bukti_bayar ?? null, 'memo_penyelesaian' => $persetujuanPenawaran->noc->memo_penyelesaian ?? $persetujuanPenawaran->memo_penyelesaian ?? null, diff --git a/resources/views/noc/penyelesaian.blade.php b/resources/views/noc/penyelesaian.blade.php index 4fd7826..f4367b6 100644 --- a/resources/views/noc/penyelesaian.blade.php +++ b/resources/views/noc/penyelesaian.blade.php @@ -19,6 +19,14 @@