162 lines
4.8 KiB
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.');
|
|
}
|
|
}
|