NIM_E31220400/app/Http/Controllers/PemasukanController.php

162 lines
4.8 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Pemasukan;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Redirect;
use App\Mail\PemasukanDiterimaMail;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Carbon;
class PemasukanController extends Controller
{
public function index(Request $request)
{
$query = Pemasukan::query();
// Cek filter waktu
if ($request->has('filter')) {
$filter = $request->filter;
if ($filter === 'hari') {
$query->whereDate('tanggal', now());
} elseif ($filter === 'minggu') {
$query->whereBetween('tanggal', [
now()->startOfWeek(), now()->endOfWeek()
]);
} elseif ($filter === 'bulan') {
$query->whereMonth('tanggal', now()->month)
->whereYear('tanggal', now()->year);
} elseif ($filter === 'tahun') {
$query->whereYear('tanggal', now()->year);
}
}
// Ambil data sesuai filter + pagination
$pemasukans = $query->orderBy('tanggal', 'desc')->paginate(10);
// Ambil semua data hasil filter untuk hitung total
$allPemasukans = $query->get();
// Hitung total
$total = $allPemasukans->reduce(function ($carry, $item) {
if ($item->kategori === 'uang') {
return $carry + $item->jumlah;
} elseif ($item->kategori === 'barang' && $item->quantity && $item->harga) {
return $carry + ($item->quantity * $item->harga);
}
return $carry;
}, 0);
return view('transaksi.pemasukan.index', compact('pemasukans', 'total'));
}
public function accept($id)
{
$pemasukan = Pemasukan::findOrFail($id);
if ($pemasukan->status !== 'Diterima') {
$pemasukan->status = 'Diterima';
$pemasukan->save();
// Kirim email setelah simpan
Mail::to($pemasukan->email)->send(new PemasukanDiterimaMail($pemasukan));
return redirect()->back()->with('success', 'Sumbangan telah diterima dan email sudah dikirim.');
}
return redirect()->back()->with('success', 'Sumbangan sudah diterima sebelumnya.');
}
public function reject($id)
{
$pemasukan = Pemasukan::findOrFail($id);
if ($pemasukan->status !== 'Ditolak') {
$pemasukan->status = 'Ditolak';
$pemasukan->save();
return Redirect::back()->with('success', 'Sumbangan telah ditolak.');
}
return Redirect::back()->with('success', 'Sumbangan sudah ditolak sebelumnya.');
}
public function create()
{
return view('transaksi.pemasukan.create');
}
public function store(Request $request)
{
$validated = $request->validate([
'tanggal' => 'required|date',
'nama' => 'required|string|max:255',
'kategori' => 'required|in:uang,barang',
'jumlah' => 'nullable|numeric',
'harga' => 'nullable|numeric',
'quantity' => 'nullable|numeric',
'keterangan' => 'nullable|string|max:255',
'bukti' => 'nullable|image|mimes:jpeg,png,jpg|max:2048',
]);
// Jika kategori barang, hitung jumlah otomatis
if ($validated['kategori'] === 'barang') {
$validated['jumlah'] = $validated['harga'] * $validated['quantity'];
}
if ($request->hasFile('bukti')) {
$file = $request->file('bukti');
$filename = time() . '_' . $file->getClientOriginalName();
$file->storeAs('public/bukti_sumbangan', $filename);
$validated['bukti'] = $filename;
}
$validated['status'] = 'Diterima';
Pemasukan::create($validated);
return redirect()->route('pemasukan.index')->with('success', 'Data berhasil ditambahkan.');
}
public function edit(Pemasukan $pemasukan)
{
return view('transaksi.pemasukan.edit', compact('pemasukan'));
}
public function update(Request $request, Pemasukan $pemasukan)
{
$request->validate([
'tanggal' => 'required|date',
'kategori' => 'required|string',
'nama' => 'required|string|max:255',
'jumlah' => 'required|numeric',
'quantity' => 'nullable|numeric',
'keterangan' => 'nullable|string|max:255',
]);
$data = $request->all();
if ($request->kategori !== 'barang') {
$data['quantity'] = null;
}
// Tetap simpan keterangan walau kategori bukan barang
$data['keterangan'] = $data['keterangan'] ?? '';
$pemasukan->update($data);
return redirect()->route('pemasukan.index')->with('success', 'Data berhasil diperbarui.');
}
public function destroy(Pemasukan $pemasukan)
{
$pemasukan->delete();
return redirect()->route('pemasukan.index')->with('success', 'Data berhasil dihapus.');
}
}