get('selected_ids', []); // Pastikan $selectedIds selalu berupa array if (is_string($selectedIds)) { $selectedIds = explode(',', $selectedIds); } // Filter array untuk menghilangkan nilai kosong $selectedIds = array_filter($selectedIds, function($id) { return !empty(trim($id)); }); $permohonanList = []; $totalBiayaPJ = 0; if (!empty($selectedIds) && count($selectedIds) > 0) { try { $permohonanList = Permohonan::with([ 'user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian', 'jenisFasilitasKredit', 'documents.inspeksi', 'penilai', 'documents.detail', 'noc' ])->whereIn('id', $selectedIds)->get(); // Hitung total biaya PJ dari nominal_bayar di tabel NOC $totalBiayaPJ = Noc::whereIn('permohonan_id', $selectedIds) ->sum('nominal_bayar'); Log::info('MemoController: Total Biaya PJ dihitung: ' . $totalBiayaPJ); } catch (Exception $e) { Log::error('MemoController: Error saat mengambil data permohonan - ' . $e->getMessage()); return redirect()->back()->with('error', 'Terjadi kesalahan saat memuat data'); } } return view('lpj::memo.create', compact('permohonanList', 'totalBiayaPJ')); } /** * Menyimpan memo penyelesaian yang telah dibuat * * @param Request $request * @return \Illuminate\Http\RedirectResponse */ public function store(Request $request) { Log::info('MemoController: Memulai proses penyimpanan memo penyelesaian'); DB::beginTransaction(); try { // Validasi input $request->validate([ 'permohonan_ids' => 'required|array', 'permohonan_ids.*' => 'exists:permohonan,id', 'memo_number' => 'required|string|max:255', 'payment_date' => 'required|date', 'memo_date' => 'required|date' ]); $permohonanIds = $request->permohonan_ids; $memoNumber = $request->memo_number; $paymentDate = $request->payment_date; $memoDate = $request->memo_date; // Update status permohonan yang dipilih foreach ($permohonanIds as $permohonanId) { $permohonan = Permohonan::find($permohonanId); if ($permohonan) { $permohonan->status = 'memo-penyelesaian'; $permohonan->memo_penyelesaian_number = $memoNumber; $permohonan->memo_penyelesaian_date = $memoDate; $permohonan->memo_penyelesaian_payment_date = $paymentDate; $permohonan->memo_penyelesaian_created_at = now(); $permohonan->save(); Log::info('MemoController: Berhasil update permohonan ID: ' . $permohonanId); } } DB::commit(); Log::info('MemoController: Berhasil menyimpan memo penyelesaian untuk ' . count($permohonanIds) . ' permohonan'); return redirect()->route('memo.index') ->with('success', 'Memo penyelesaian berhasil dibuat untuk ' . count($permohonanIds) . ' permohonan'); } catch (Exception $e) { DB::rollback(); Log::error('MemoController: Error saat menyimpan memo penyelesaian - ' . $e->getMessage()); return redirect()->back() ->withInput() ->with('error', 'Terjadi kesalahan saat menyimpan memo penyelesaian: ' . $e->getMessage()); } } /** * Menampilkan detail memo penyelesaian * * @param int $id * @return \Illuminate\View\View */ public function show($id) { Log::info('MemoController: Mengakses detail memo penyelesaian ID: ' . $id); $permohonan = Permohonan::with([ 'user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian', 'jenisFasilitasKredit', 'documents.inspeksi', 'penilai', 'documents.detail', 'noc' ])->findOrFail($id); return view('lpj::memo.show', compact('permohonan')); } /** * Mengambil data untuk datatables pada halaman memo penyelesaian * * @param Request $request * @return \Illuminate\Http\JsonResponse */ public function dataForDatatables(Request $request) { Log::info('MemoController: Mengambil data untuk datatables'); if (is_null($this->user) || !$this->user->can('debitur.view')) { Log::warning('MemoController: User tidak memiliki permission untuk melihat data'); // abort(403, 'Sorry! You are not allowed to view users.'); } // Mengambil data dari database dengan kondisi yang sama seperti LaporanController $query = Permohonan::query() ->whereIn('status', ['proses-laporan', 'done', 'paparan', 'proses-paparan', 'memo-penyelesaian']) ->whereNotNull('approval_so_at') ->whereNotNull('approval_eo_at') ->where(function ($q) { $q->whereIn('nilai_plafond_id', [1, 4]) ->whereNotNull('approval_dd_at') ->orWhereIn('nilai_plafond_id', [2, 3]); }); $query = $query->orderBy('nomor_registrasi', 'desc'); // Apply search filter jika ada if ($request->has('search') && !empty($request->get('search'))) { $search = $request->get('search'); $query->where(function ($q) use ($search) { $q->where('nomor_registrasi', 'LIKE', '%' . $search . '%'); $q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%'); $q->orWhereRelation('user', 'name', 'LIKE', '%' . $search . '%'); $q->orWhereRelation('debiture', 'name', 'LIKE', '%' . $search . '%'); $q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%'); $q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%'); $q->orWhere('status', 'LIKE', '%' . $search . '%'); }); } // Apply sorting jika ada if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { $order = $request->get('sortOrder'); $column = $request->get('sortField'); $query->orderBy($column, $order); } // Mendapatkan total count records $totalRecords = $query->count(); $size = $request->get('size', 10); if ($size == 0) { $size = 10; } // Apply pagination jika ada if ($request->has('page') && $request->has('size')) { $page = $request->get('page'); $size = $request->get('size'); $offset = ($page - 1) * $size; $query->skip($offset)->take($size); } // Mendapatkan filtered count records $filteredRecords = $query->count(); // Mendapatkan data untuk halaman saat ini $data = $query->with([ 'user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian', 'jenisFasilitasKredit', 'documents.inspeksi', 'penilai', 'documents.detail', 'noc' ])->get(); // Menghitung page count $pageCount = ceil($totalRecords / $size); // Menghitung current page number $currentPage = max(1, $request->get('page', 1)); Log::info('MemoController: Berhasil mengambil data datatables - Total: ' . $totalRecords . ', Filtered: ' . $filteredRecords); // Return response data sebagai JSON object return response()->json([ 'draw' => $request->get('draw'), 'recordsTotal' => $totalRecords, 'recordsFiltered' => $filteredRecords, 'pageCount' => $pageCount, 'page' => $currentPage, 'totalCount' => $totalRecords, 'data' => $data, ]); } /** * Mengambil total biaya PJ berdasarkan permohonan yang dipilih * * @param Request $request * @return \Illuminate\Http\JsonResponse */ public function getTotalBiayaPJ(Request $request) { Log::info('MemoController: Mengambil total biaya PJ'); try { $permohonanIds = $request->get('permohonan_ids', []); // Pastikan $permohonanIds selalu berupa array if (is_string($permohonanIds)) { $permohonanIds = explode(',', $permohonanIds); } // Filter array untuk menghilangkan nilai kosong $permohonanIds = array_filter($permohonanIds, function($id) { return !empty(trim($id)); }); $totalBiayaPJ = 0; if (!empty($permohonanIds) && count($permohonanIds) > 0) { // Hitung total biaya PJ dari nominal_bayar di tabel NOC $totalBiayaPJ = \Modules\Lpj\Models\Noc::whereIn('permohonan_id', $permohonanIds) ->sum('nominal_bayar'); } Log::info('MemoController: Total Biaya PJ berhasil dihitung: ' . $totalBiayaPJ); return response()->json([ 'success' => true, 'total_biaya_pj' => $totalBiayaPJ, 'total_biaya_pj_formatted' => 'Rp ' . number_format($totalBiayaPJ, 0, ',', '.') ]); } catch (Exception $e) { Log::error('MemoController: Error saat menghitung total biaya PJ - ' . $e->getMessage()); return response()->json([ 'success' => false, 'message' => 'Terjadi kesalahan saat menghitung total biaya PJ' ], 500); } } }