TKK_E32230908/app/Http/Controllers/Admin/PeminjamanController.php

241 lines
7.7 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\BorrowTransaction;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Mail;
use App\Mail\BukuSiapDiambilMail;
use App\Mail\PeminjamanDitolakMail;
use App\Mail\BukuDikembalikanMail;
use App\Mail\PerpanjanganDisetujuiMail;
use App\Mail\PerpanjanganDitolakMail;
use Carbon\Carbon;
class PeminjamanController extends Controller
{
public function index()
{
$transactions = BorrowTransaction::with(['anggota', 'koleksi'])
->orderBy('created_at', 'desc')
->get();
return view('admin.peminjaman', compact('transactions'));
}
public function downloadSuratPengantar($id)
{
$transaction = BorrowTransaction::findOrFail($id);
if (!$transaction->surat_pengantar) {
return back()->with('error', 'File surat pengantar tidak tersedia.');
}
$filePath = 'public/surat_pengantar/' . $transaction->surat_pengantar;
if (!Storage::exists($filePath)) {
return back()->with('error', 'File surat pengantar tidak ditemukan.');
}
return Storage::download($filePath, $transaction->surat_pengantar);
}
public function kembalikan($id)
{
$transaction = BorrowTransaction::findOrFail($id);
if (!in_array($transaction->status, ['dipinjam', 'pengembalian_menunggu'])) {
return redirect()->route('admin.peminjaman')
->with('error', 'Transaksi ini belum dipinjam atau sudah dikembalikan.');
}
$transaction->markAsDikembalikan();
if ($transaction->anggota && $transaction->anggota->email) {
try {
Mail::to($transaction->anggota->email)->send(new BukuDikembalikanMail($transaction));
} catch (\Exception $e) {
}
}
return redirect()->route('admin.peminjaman')
->with('success', 'Buku berhasil ditandai sebagai dikembalikan.');
}
public function setujui(Request $request, $id)
{
$transaction = BorrowTransaction::findOrFail($id);
if (!in_array($transaction->status, ['menunggu', 'pending'])) {
return redirect()->back()->with('error', 'Transaksi ini sudah diproses.');
}
$request->validate([
'pickup_date' => 'required|date',
'pickup_time' => 'required|date_format:H:i',
'tanggal_kembali' => 'nullable|date|after_or_equal:pickup_date',
]);
$tanggalKembali = $request->tanggal_kembali
? Carbon::parse($request->tanggal_kembali)
: Carbon::parse($request->pickup_date)->addDays(7);
$transaction->pickup_date = $request->pickup_date;
$transaction->pickup_time = $request->pickup_time;
$transaction->tanggal_kembali = $tanggalKembali;
$transaction->status = 'disetujui';
$transaction->save();
if ($transaction->anggota && $transaction->anggota->email) {
try {
Mail::to($transaction->anggota->email)
->send(new BukuSiapDiambilMail($transaction));
} catch (\Exception $e) {
}
}
return redirect()->route('admin.peminjaman')
->with('success', 'Peminjaman disetujui. Email pemberitahuan telah dikirim ke anggota.');
}
public function ambilBuku($id)
{
$transaction = BorrowTransaction::findOrFail($id);
if ($transaction->status !== 'disetujui') {
return redirect()->route('admin.peminjaman')
->with('error', 'Buku belum disetujui atau sudah diambil.');
}
$transaction->markAsDipinjam();
return redirect()->route('admin.peminjaman')
->with('success', 'Buku berhasil diambil. Status transaksi: Dipinjam.');
}
public function tolak($id)
{
$transaction = BorrowTransaction::findOrFail($id);
if (!in_array($transaction->status, ['menunggu', 'pending'])) {
return redirect()->back()->with('error', 'Transaksi ini sudah diproses.');
}
$transaction->markAsDitolak();
if ($transaction->anggota && $transaction->anggota->email) {
try {
Mail::to($transaction->anggota->email)
->send(new PeminjamanDitolakMail($transaction));
} catch (\Exception $e) {
}
}
return redirect()->route('admin.peminjaman')
->with('success', 'Peminjaman ditolak dan email pemberitahuan dikirim.');
}
public function setujuiPengembalian($id)
{
$transaction = BorrowTransaction::findOrFail($id);
if ($transaction->status !== 'pengembalian_menunggu') {
return back()->with('error', 'Transaksi ini tidak menunggu pengembalian.');
}
$transaction->markAsDikembalikan();
if ($transaction->anggota && $transaction->anggota->email) {
try {
Mail::to($transaction->anggota->email)->send(new BukuDikembalikanMail($transaction));
} catch (\Exception $e) {
}
}
return redirect()->route('admin.peminjaman')
->with('success', 'Pengembalian buku telah disetujui oleh admin.');
}
public function store(Request $request)
{
$request->validate([
'anggota_id' => 'required|exists:anggota,id',
'koleksi_id' => 'required|exists:koleksis,biblio_id',
'tanggal_pinjam' => 'required|date',
'surat_pengantar' => 'nullable|file|mimes:pdf|max:2048',
]);
$data = $request->only('anggota_id', 'koleksi_id', 'tanggal_pinjam');
if ($request->hasFile('surat_pengantar')) {
$file = $request->file('surat_pengantar');
$filename = time() . '_' . $file->getClientOriginalName();
$file->storeAs('public/surat_pengantar', $filename);
$data['surat_pengantar'] = $filename;
}
$data['status'] = 'menunggu';
BorrowTransaction::create($data);
return redirect()->route('admin.peminjaman')
->with('success', 'Transaksi peminjaman berhasil dibuat dan menunggu persetujuan.');
}
public function setujuiPerpanjangan($id)
{
$transaction = BorrowTransaction::findOrFail($id);
if ($transaction->status !== 'perpanjangan_menunggu') {
return back()->with('error', 'Transaksi ini tidak menunggu perpanjangan.');
}
$transaction->tanggal_kembali = Carbon::parse($transaction->tanggal_kembali)->addDays(7);
$transaction->status = 'dipinjam';
$transaction->save();
if ($transaction->anggota && $transaction->anggota->email) {
try {
Mail::to($transaction->anggota->email)
->send(new PerpanjanganDisetujuiMail($transaction));
} catch (\Exception $e) {
}
}
return back()->with('success', 'Perpanjangan disetujui dan email telah dikirim ke anggota.');
}
public function tolakPerpanjangan($id)
{
$transaction = BorrowTransaction::findOrFail($id);
if ($transaction->status !== 'perpanjangan_menunggu') {
return back()->with('error', 'Transaksi ini tidak menunggu perpanjangan.');
}
$transaction->status = 'dipinjam';
$transaction->save();
if ($transaction->anggota && $transaction->anggota->email) {
try {
Mail::to($transaction->anggota->email)
->send(new PerpanjanganDitolakMail($transaction));
} catch (\Exception $e) {
}
}
return back()->with('success', 'Perpanjangan ditolak dan email pemberitahuan telah dikirim.');
}
}