241 lines
7.7 KiB
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.');
|
|
}
|
|
}
|