format('m/Y'); // Mengambil semua data produk untuk pilihan di formulir $products = Product::all(); // Membuat nomor Surat Jalan dengan format "SJ/XX/LEP/MM/YYYY" $noSurat = "SJ/" . str_pad($lastId, 2, '0', STR_PAD_LEFT) . "/LEP/" . $monthYear; // Mengembalikan tampilan formulir untuk membuat Surat Jalan baru dengan nomor dan produk return view('admin.administrasi.add-surat-jalan', compact('noSurat', 'products')); } // Menyimpan Surat Jalan baru ke database public function store(Request $request) { try { // Memvalidasi data yang dikirim dari formulir $validate = $request->validate([ 'nama_penerima' => 'required|string', 'nama_produk' => 'required|string', 'jenis_kendaraan' => 'required', 'no_pol' => 'required|string', 'jumlah' => 'required|numeric|min:0', 'no_surat' => 'required|string', 'tanggal' => 'required|date', 'masa' => 'required|date' ]); // Memformat tanggal ke format 'Y-m-d' untuk disimpan di database $tanggalFormatted = date('Y-m-d', strtotime($validate['tanggal'])); // Menghitung masa berlaku (6 bulan dari tanggal) dan memformatnya $masaFormatted = \Carbon\Carbon::parse($tanggalFormatted)->addMonths(6)->format('Y-m-d'); // Mengambil ID terakhir untuk membuat nomor Surat Jalan unik $lastId = SuratJalan::max('id') + 1; // Mengambil bulan dan tahun saat ini untuk nomor Surat Jalan $monthYear = Carbon::now()->format('m/Y'); // Membuat nomor Surat Jalan dengan format "SJ/XX/LEP/MM/YYYY" $noSurat = "SJ/" . str_pad($lastId, 2, '0', STR_PAD_LEFT) . "/LEP/" . $monthYear; // Menyimpan data Surat Jalan baru ke database dengan data yang sudah divalidasi SuratJalan::create([ 'nama_penerima' => $validate['nama_penerima'], 'nama_produk' => $validate['nama_produk'], 'jenis_kendaraan' => $validate['jenis_kendaraan'], 'no_pol' => $validate['no_pol'], 'tanggal' => $tanggalFormatted, 'masa' => $masaFormatted, 'jumlah' => $validate['jumlah'], 'no_surat' => $noSurat, ]); // Mengarahkan kembali ke daftar Surat Jalan dengan pesan sukses return redirect()->route('surat-jalan')->with('success', 'Surat jalan berhasil dibuat.'); } catch (\Exception $e) { // Mencatat error ke log untuk keperluan debugging Log::error('Gagal menyimpan surat jalan', [ 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString(), 'data' => $request->all(), // Mencatat data input untuk diperiksa ]); // Mengarahkan kembali ke halaman sebelumnya dengan pesan error return redirect()->back()->with('error', 'Terjadi kesalahan. Silakan cek log untuk detail.'); } } // Memperbarui data Surat Jalan yang sudah ada public function update(Request $request, $id) { // Memvalidasi data yang dikirim dari formulir $validate = $request->validate([ 'nama_penerima' => 'required|string|max:255', 'jenis_kendaraan' => 'required|string', 'no_pol' => 'required|string', 'tanggal' => 'required|date', 'jumlah' => 'required|numeric|min:0', 'masa' => 'required|date', 'tanggal' => 'required|date' ]); // Memformat tanggal ke format 'Y-m-d' untuk disimpan di database $tanggalFormatted = date('Y-m-d', strtotime($validate['tanggal'])); // Menghitung masa berlaku (6 bulan dari tanggal) dan memformatnya $masaFormatted = \Carbon\Carbon::parse($tanggalFormatted)->addMonths(6)->format('Y-m-d'); // Mencari Surat Jalan berdasarkan ID, jika tidak ditemukan akan memunculkan error 404 $suratJalan = SuratJalan::findOrFail($id); // Memperbarui data Surat Jalan dengan data yang sudah divalidasi $suratJalan->update([ 'nama_penerima' => $request->nama_penerima, 'no_pol' => $request->no_pol, // 'nama_produk' => $request->nama_produk, // Dikomentari, mungkin tidak diupdate 'jenis_kendaraan' => $request->jenis_kendaraan, 'jumlah' => $request->jumlah, 'tanggal' => $tanggalFormatted, 'masa' => $masaFormatted ]); // Mengarahkan kembali ke daftar Surat Jalan dengan pesan sukses return redirect()->route('surat-jalan')->with('success', 'Data Surat Jalan Berhasil diperbarui'); } // Menampilkan pratinjau Surat Jalan dalam format PDF di browser public function preview($id) { // Mencari Surat Jalan berdasarkan ID, jika tidak ditemukan akan memunculkan error 404 $suratJalan = SuratJalan::findOrFail($id); // Memformat tanggal ke format yang mudah dibaca (misalnya, "18 Mei 2025") $tanggal = Carbon::parse($suratJalan->tanggal)->format('d F Y'); // Mengambil data profil perusahaan (dengan ID = 1) $dataPerusahaan = Profile::find(1); // Mengambil logo perusahaan dari penyimpanan dan mengubahnya ke format base64 untuk disisipkan di PDF $imagePath = public_path('storage/logos/' . $dataPerusahaan->logo_company); $logoImage = base64_encode(file_get_contents($imagePath)); // Membuat PDF menggunakan tampilan 'view-surat-jalan' dengan data Surat Jalan, tanggal, logo, dan perusahaan $pdf = PDF::loadView('admin.administrasi.view-surat-jalan', [ 'suratJalan' => $suratJalan, 'tanggal' => $tanggal, 'logoImage' => $logoImage, 'data' => $dataPerusahaan ]); // Mengatur ukuran kertas khusus untuk PDF (610x312 poin) $pdf->setPaper([0, 0, 610, 312]); // Mengganti karakter slash di no_surat untuk membuat nama file yang aman $cleanFileName = str_replace(['/', '\\'], '-', $suratJalan->no_surat); // Menampilkan PDF di browser tanpa memaksa unduh return $pdf->stream('surat-jalan-' . $cleanFileName . '.pdf', [ 'Attachment' => false ]); } // Mengunduh Surat Jalan dalam format PDF public function download($id) { // Mencari Surat Jalan berdasarkan ID, jika tidak ditemukan akan memunculkan error 404 $suratJalan = SuratJalan::findOrFail($id); // Memformat tanggal ke format yang mudah dibaca (misalnya, "18 Mei 2025") $tanggal = Carbon::parse($suratJalan->tanggal)->format('d F Y'); // Mengambil data profil perusahaan (dengan ID = 1) $dataPerusahaan = Profile::find(1); // Mengambil logo perusahaan dari penyimpanan dan mengubahnya ke format base64 untuk disisipkan di PDF $imagePath = public_path('storage/logos/' . $dataPerusahaan->logo_company); $logoImage = base64_encode(file_get_contents($imagePath)); // Membuat PDF menggunakan tampilan 'view-surat-jalan' dengan data Surat Jalan, tanggal, logo, dan perusahaan $pdf = PDF::loadView('admin.administrasi.view-surat-jalan', [ 'suratJalan' => $suratJalan, 'tanggal' => $tanggal, 'logoImage' => $logoImage, 'data' => $dataPerusahaan ]); // Mengatur ukuran kertas khusus untuk PDF (610x312 poin) $pdf->setPaper([0, 0, 610, 312]); // Mengganti karakter slash di no_surat untuk membuat nama file yang aman $cleanFileName = str_replace(['/', '\\'], '-', $suratJalan->no_surat); // Memaksa unduh PDF dengan nama file yang ditentukan return $pdf->download('surat-jalan-' . $cleanFileName . '.pdf'); } }