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.'); } }